vs2010 Оптимизация хвостового вызова C ++

Рассмотрим следующий код:

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

10
задан ildjarn 9 October 2012 в 20:27
поделиться