呃, 所以呢? 是不是感觉还不够过瘾... 谁说尾递归调用就不用创建新的栈呢?
还是让我们去底层一探究竟吧
int tail_recursion(int n, int total) { if (n == 0) { return total; } else { return tail_recursion(n-1, total+n); }}int main(void) { int total = 0, n = 4; tail_recursion(n, total); return 0;}
反汇编
$ gcc -S tail_recursion.c -o normal_recursion.S
$ gcc -S -O2 tail_recursion.c -o tail_recursion.S
gcc开启尾递归优化
对比反汇编代码如下(AT&T语法)
可以看到, 开启尾递归优化前, 使用call调用函数, 创建了新的调用栈(LBB0_3);