[C++] vs2010的c ++尾部调用优化


Answers

我试了下面的代码

#include "stdafx.h"

int f( size_t i, int x )
{
    return ( ( i < 2 ) ? x : f( i - 1, i * x ) );
}

int f( size_t i )
{
    return ( f( i, 1 ) );
}

int _tmain(int argc, _TCHAR* argv[])
{
    {
        f( 0 );
    }

    return 0;
}

并使用完全优化/牛,但我没有得到尾递归。 所以看来MS VC ++ 2010不支持尾递归。

Question

考虑下面的代码:

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文件一切正常,tail调用被优化。

尝试更换

int x = fac( 50 );

int x = fac_aux( 50, 1 );

奇怪的是,但尾部呼叫优化消失。 据我记得,在VS2008中没有这样一个奇怪的编译器行为。 任何想法为什么会发生这些事情,以及如何确保尾巴呼叫优化完成?

; 函数编译标志:/ Ogtp

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

编辑 :VS2012设法做优化




我不知道它是否会工作,但试着用单个return语句替换if ... else:

return (x == 1) ? res : fac_aux( x - 1, res * x );