Рассмотрим следующий код:
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
Пробовал флаги оптимизации /O 2 и/Ox. Существуют ли какие-либо другие параметры компилятора?
Изменить: VS2012 удается выполнить оптимизацию