Hãy nói rằng tôi có một chức năng đơn giản như thế này:khai thác ngắn mạch và đuôi đệ quy
int all_true(int* bools, int len) {
if (len < 1) return TRUE;
return *bools && all_true(bools+1, len-1);
}
Chức năng này có thể được viết lại theo một phong cách rõ ràng hơn đuôi-đệ quy như sau:
int all_true(int* bools, int len) {
if (len < 1) return TRUE;
if (!*bools) return FALSE;
return all_true(bools+1, len-1);
}
Một cách hợp lý, không có sự khác biệt giữa hai; giả sử bools
chỉ chứa TRUE
hoặc FALSE
(được xác định một cách hợp lý), chúng thực hiện chính xác điều tương tự.
Câu hỏi của tôi là: nếu trình biên dịch đủ thông minh để tối ưu hóa cuộc gọi thứ hai dưới dạng cuộc gọi đệ quy đuôi, có hợp lý để mong đợi nó tối ưu hóa lần đầu tiên theo cùng một cách hay không, với điều kiện là "ngắn mạch" & &? Rõ ràng, nếu một toán tử không mạch ngắn được sử dụng, thì không là đệ quy đuôi bởi vì cả hai biểu thức sẽ được đánh giá trước khi toán tử được áp dụng, nhưng tôi tò mò về trường hợp ngắn mạch.
(Trước khi tôi nhận được một loạt các chú thích nói với tôi rằng các trình biên dịch C thường không tối ưu hóa các cuộc gọi đệ quy đuôi: xem đây là câu hỏi chung về tối ưu hóa các cuộc gọi đệ quy đuôi với các toán tử ngắn mạch, độc lập với ngôn ngữ. Tôi sẽ rất vui khi viết lại điều này trong Đề án, Haskell, OCaml, F #, Python, hoặc những gì heck khác cho bạn nếu bạn không hiểu C.)
gcc tối ưu hóa các cuộc gọi đệ quy. – Arafangion