vs2010 c尾调用优化

vs2010 c尾调用优化,第1张

概述请考虑以下代码: 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 ) 请考虑以下代码:
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,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尾调用优化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1248269.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存