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