Рассмотрим следующий код:
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
? - person SirDarius   schedule 08.03.2011/Ox
переключить оптимизацию на/O2
. Полная оптимизация имени для/Ox
несколько обманчива (по крайней мере, в современных версиях); на самом деле вы получаете по крайней мере тот же уровень оптимизации, если не больше, с/O2
. - person Cody Gray   schedule 31.07.2012