呃, 所以呢? 是不是感覺還不夠過癮... 誰說尾遞歸調用就不用創(chuàng)建新的棧呢?
還是讓我們去底層一探究竟吧
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開啟尾遞歸優(yōu)化
對比反匯編代碼如下(AT&T語法)
可以看到, 開啟尾遞歸優(yōu)化前, 使用call調用函數, 創(chuàng)建了新的調用棧(LBB0_3);