次のコードを検討してください。
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はなんとか最適化を行うことができます