Visual C++尾部调用优化

Mic*_* K. 3 c++ tail-recursion visual-studio-2010 tail-call tail-call-optimization

根据该问题的答案: 如果有的话,哪些C++编译器会进行尾递归优化? 看起来,编译器应该进行尾递归优化.

但我已经尝试过提出的选项,似乎编译器在模板函数的情况下不能进行这种优化.它能以某种方式修复吗?

小智 6

我不使用MS编译器,但GCC肯定可以对模板进行尾递归优化.鉴于此功能:

template <typename T>
T f( T t ) {
   cout << t << endl;
   if ( t == 0 ) {
      return t;
   }
   return f( t - 1 );
}
Run Code Online (Sandbox Code Playgroud)

生成的代码是:

    5   T f( T t ) {
    6       cout << t << endl;
-   0x401362    <main+22>:      mov    %esi,0x4(%esp)
-   0x401366    <main+26>:      movl   $0x4740c0,(%esp)
-   0x40136d    <main+33>:      call   0x448620 <_ZNSolsEi>
-   0x401372    <main+38>:      mov    %eax,%ebx
    7      if ( t == 0 ) {
-   0x4013a5    <main+89>:      test   %esi,%esi
-   0x4013a7    <main+91>:      je     0x4013c8 <main+124>
    8         return t;
    9      }
    10     return f( t - 1 );
-   0x4013a9    <main+93>:      dec    %esi
-   0x4013aa    <main+94>:      jmp    0x401362 <main+22>
    11  }
Run Code Online (Sandbox Code Playgroud)

您可以看到递归调用已转变为跳回函数的开头.如果代码是在启用了优化的情况下编译的(在这种情况下为-O2),则此优化仅由GCC执行 - 对于MS C++,可能也是如此.