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++,可能也是如此.
| 归档时间: |
|
| 查看次数: |
2413 次 |
| 最近记录: |