
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,1013B1003 JE SHORT TestThin.013B100E013B1005 IMul EAX,ECX013B1008 DEC ECX013B1009 CMP ECX,1013B100C JNZ SHORT TestThin.013B1005013B100E RETN013B100F INT3TestThin.main 013B1010 MOV EAX,32013B1015 LEA ECX,DWORD PTR DS:[EAX-1] ;notice the partial inlining of x - 1013B1018 CALL TestThin.fac_aux总结
以上是内存溢出为你收集整理的vs2010 c尾调用优化全部内容,希望文章能够帮你解决vs2010 c尾调用优化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)