考虑以下代码:
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;
}
根据生成的汇编文件,一切正常,尾调用已经被优化。尝试替换。
int x = fac( 50 );
使用
int x = fac_aux( 50, 1 );
奇怪的是,尾调用优化消失了。据我记得,在VS2008中没有这样奇怪的编译器行为。有什么想法为什么会发生这些事情,如何确保进行了尾调用优化?
; 函数编译标志:/Ogtp
尝试了/O2和/Ox两种优化标志。是否还有其他编译器选项很重要?
编辑:VS2012可以进行优化
fac
函数? - SirDarius/Ox
优化开关而不是/O2
。/Ox
的名称“完全优化”有些具有误导性(至少在当代版本中); 实际上,您可以通过/O2
获得至少与/Ox
相同的优化水平,甚至更高。 - Cody Gray