【发布时间】:2011-07-11 01:11:45
【问题描述】:
考虑以下代码:
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函数? -
所以实际上从未调用过未优化的函数?还是您在谈论第一个函数中的尾调用?
-
@Voivoid:该函数实际上是在程序集中调用吗? (可能,但我想我会问)
-
仅供参考,there's no reason to use the
/Oxoptimization switch in preference to/O2。/Ox的“完全优化”这个名字有点欺骗性(至少在当代版本中);实际上,与/O2相比,您至少获得了相同级别的优化,甚至更多。
标签: c++ visual-studio-2010 visual-c++ tail-call-optimization