加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

vs2010 c尾调用优化

发布时间:2020-12-16 05:34:46 所属栏目:百科 来源:网络整理
导读:请考虑以下代码: 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 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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读