c++ - vs2010 c++尾调用优化

标签 c++ visual-studio-2010 visual-c++ tail-call-optimization

考虑以下代码:

int fac_aux( int x, int res ) {
    if( x == 1 ) return res;
    else return fac_aux( x - 1, res * x );
}

int fac( int x ) {
    return fac_aux( x, 1 );
}

int main() {
    int x = fac( 50 );

    std::cout << x;
    return 0;
}

根据生成的 asm 文件,一切正常,尾调用已优化。

尝试替换

int x = fac( 50 );

int x = fac_aux( 50, 1 );

奇怪的是,尾调用优化消失了。据我所知,VS2008 中没有这种奇怪的编译器行为。知道为什么会发生这些事情以及如何确保完成尾调用优化吗?

;函数编译标志:/Ogtp

尝试了/O2 和/Ox 优化标志。还有其他重要的编译器选项吗?

编辑:VS2012 设法做了优化

最佳答案

编译原件时,调用点的程序集有 fac_aux 的部分内联,特别是 x - 1 部分,这是尾递归所必需的,但是使用 fac_aux 可以防止部分内联,从而防止尾递归优化:

TestThin.fac_aux 013B1000   CMP ECX,1
013B1003                    JE SHORT TestThin.013B100E
013B1005                    IMUL EAX,ECX
013B1008                    DEC ECX
013B1009                    CMP ECX,1
013B100C                    JNZ SHORT TestThin.013B1005
013B100E                    RETN
013B100F                    INT3
TestThin.main 013B1010      MOV EAX,32
013B1015                    LEA ECX,DWORD PTR DS:[EAX-1] ;notice the partial inlining of x - 1
013B1018                    CALL TestThin.fac_aux

关于c++ - vs2010 c++尾调用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231823/

相关文章:

python - 从 Python 调用 C++ dll

c++ - 在 Eigen 中初始化矩阵

c# - VS 2010 和 MBUnit 如何只运行一个测试

c++ - 如何禁用 C++ 7.1 名称修改? :(

c++ - 默认预处理器定义和跨平台编译

c# - C# 的 C++ ifstream 异常掩码

C++ SQL绑定(bind)参数

debugging - Visual Studio 2010 : suddently Locals, 立即窗口和监视不起作用

visual-studio-2010 - 为什么我的字体在 Visual Studio 2010 中变得模糊?

c++ - 我如何 "do (condition) for x seconds"(c++)