6

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.)

+0

gcc tối ưu hóa các cuộc gọi đệ quy. – Arafangion

Trả lời

2

Câu hỏi của bạn thực sự là "trình biên dịch thông minh như thế nào ? " nhưng bạn không nói trình biên dịch bạn đang sử dụng.

Với một trình biên dịch hợp lý giả thuyết mà chuyển đổi mã nguồn để một đồ thị dòng chảy trung gian trước khi tối ưu hóa, cả hai mảnh mã mà bạn đã viết có thể được biểu diễn theo cách tương tự (các nhà điều hành & &, trong khi thuận tiện để gõ, không phải là gần như được biên dịch một cách trivially như là toán tử &, vì vậy tôi sẽ không ngạc nhiên nếu nó được mở rộng ra trong một pha trên một trình biên dịch giả định). Trên giả định đó, nó là hợp lý để khẳng định rằng câu trả lời cho câu hỏi của bạn là "có".

Tuy nhiên, nếu bạn thực sự sẽ dựa vào điều này, bạn chỉ nên thử nghiệm nó với bất kỳ trình biên dịch nào bạn đang sử dụng.

Các vấn đề liên quan