考虑以下代码:
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 设法进行优化