vs2010 c ++尾调用优化

Voi*_*oid 10 c++ visual-studio-2010 tail-call-optimization visual-c++

请考虑以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

尝试更换

int x = fac( 50 );
Run Code Online (Sandbox Code Playgroud)

int x = fac_aux( 50, 1 );
Run Code Online (Sandbox Code Playgroud)

奇怪,但尾调用优化消失了.据我所知,在VS2008中没有这么奇怪的编译器行为.任何有关这些事情发生的想法以及如何确保尾部调用优化都已完成?

; 函数编译标志:/ Ogtp

尝试了/ O2和/ Ox优化标志.是否有其他重要的编译器选项?

编辑:VS2012设法进行优化

Nec*_*lis 1

当编译原始版本时,调用站点处的程序集具有 的部分内联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
Run Code Online (Sandbox Code Playgroud)