Người trả lời khác là chính xác rằng có một số phép thuật biên dịch chuyển đổi đệ quy đuôi thành lặp lại, mặc dù nó phụ thuộc vào cài đặt tối ưu hóa của trình biên dịch. Trong gcc ví dụ, nếu chúng ta biên dịch với gcc -S -O1 someFile.c
(cho mã của bạn), chúng tôi nhận được lắp ráp tạo sau:
fun:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $0, %eax
call fun
leave
ret
.LFE2:
.size fun, .-fun
Vì vậy, bạn có thể thấy, nó vẫn sử dụng cuộc gọi/rời/hướng dẫn ret để thực hiện một cuộc gọi chức năng thực tế sẽ giết quá trình. Khi bạn bắt đầu tối ưu hóa hơn nữa với gcc -S -O2 someFile.c
chúng tôi bắt đầu nhận được sự kỳ diệu:
fun:
.LFB24:
.p2align 4,,10
.p2align 3
.L2:
jmp .L2
.LFE24:
.size fun, .-fun
.p2align 4,,15
Nó phụ thuộc vào trình biên dịch và các cài đặt trình biên dịch của bạn, vì vậy nó giúp làm bạn với họ.
Nguồn
2010-02-18 19:10:45
Nơi nào tốt hơn để đặt câu hỏi này :) –