请考虑以下代码:
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; }
尝试更换
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