Рассмотрим следующий код:
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 удается выполнить оптимизацию