gpt4 book ai didi

c++ - vs2010 c++尾调用优化

转载 作者:可可西里 更新时间:2023-11-01 16:21:58 25 4
gpt4 key购买 nike

考虑以下代码:

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

关于c++ - vs2010 c++尾调用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com