当我用g ++编译下面的简单递归代码时,汇编代码只返回i,好像g ++可以像人类那样做一些代数技巧.
int Identity(int i) {
if (i == 1)
return 1;
else
return Identity(i-1)+1;
}
Run Code Online (Sandbox Code Playgroud)
我不认为这种优化是关于尾递归的,显然,g ++必须至少做这两件事:
如何重现
% g++ -v
gcc version 8.2.1 20181127 (GCC)
% g++ a.cpp -c -O2 && objdump -d a.o
Disassembly of section .text:
0000000000000000 <_Z8Identityi>:
0: 89 f8 mov %edi,%eax
2: c3
Run Code Online (Sandbox Code Playgroud)
更新: 感谢很多人回答这个问题.我在这里收集了一些讨论和更新.
更新+回答: 感谢下面的答案(我已经标记它有用,并且还检查了manlio的答案),我想我理解编译器如何以简单的方式完成此操作.请参阅下面的示例.首先,现代gcc可以做一些比尾递归更强大的东西,所以代码转换成这样的东西:
// Equivalent to return i
int Identity_v2(int i) {
int ans = 0;
for (int …Run Code Online (Sandbox Code Playgroud)