Andere Beantworter sind korrekt, dass es eine Compiler-Magie gibt, die die Tail-Rekursion in Iteration konvertiert, obwohl dies von den Optimierungseinstellungen des Compilers abhängt. In gcc zum Beispiel kompilieren, wenn wir mit gcc -S -O1 someFile.c
(da dem Code), erhalten wir die folgende generierte Assembly:
fun:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $0, %eax
call fun
leave
ret
.LFE2:
.size fun, .-fun
So können Sie sehen, es ist immer noch Anruf mit/leave/ret Anweisungen einen tatsächlichen Funktionsaufruf auszuführen , die den Prozess beenden wird. Sobald Sie weiter mit gcc -S -O2 someFile.c
starten die Optimierung starten wir die Magie bekommen:
fun:
.LFB24:
.p2align 4,,10
.p2align 3
.L2:
jmp .L2
.LFE24:
.size fun, .-fun
.p2align 4,,15
Es auf Ihrem Compiler hängt und Ihren Compiler-Einstellungen, so hilft es, mit ihnen befreundet zu sein.
Welcher bessere Ort, um diese Frage zu stellen :) –