Dường như với tôi rằng nó sẽ hoạt động hoàn hảo để thực hiện tối ưu hóa đệ quy đuôi trong cả C và C ++, tuy nhiên trong khi gỡ lỗi tôi dường như không bao giờ thấy một ngăn xếp khung cho thấy tối ưu hóa này. Đó là loại tốt, bởi vì ngăn xếp cho tôi biết đệ quy sâu đến mức nào. Tuy nhiên, tối ưu hóa cũng sẽ tốt đẹp.
Có trình biên dịch C ++ nào thực hiện tối ưu hóa này không? Tại sao? Tại sao không?
Làm thế nào để tôi đi nói với trình biên dịch để làm điều đó?
- Đối với MSVC:
/O2
hoặc/Ox
- Đối với GCC:
-O2
hoặc-O3
Làm thế nào về việc kiểm tra nếu trình biên dịch đã làm điều này trong một trường hợp nhất định?
- Đối với MSVC, cho phép đầu ra PDB có thể theo dõi mã, sau đó kiểm tra mã
- Đối với GCC ..?
Tôi vẫn sẽ đưa ra gợi ý về cách xác định xem một chức năng nhất định có được tối ưu hóa như thế này bởi trình biên dịch hay không (mặc dù tôi thấy yên tâm rằng Konrad bảo tôi giả sử nó)
Luôn luôn có thể kiểm tra xem trình biên dịch có thực hiện việc này hay không bằng cách thực hiện đệ quy vô hạn và kiểm tra xem nó có dẫn đến một vòng lặp vô hạn hoặc tràn ngăn xếp không (tôi đã làm điều này với GCC và phát hiện ra -O2
là đủ), nhưng tôi muốn có thể kiểm tra một chức năng nào đó mà tôi biết sẽ chấm dứt bằng mọi cách. Tôi muốn có một cách dễ dàng để kiểm tra điều này :)
Sau một số thử nghiệm, tôi phát hiện ra rằng các tàu khu trục phá hỏng khả năng thực hiện tối ưu hóa này. Đôi khi có thể đáng để thay đổi phạm vi của các biến và thời gian nhất định để đảm bảo chúng đi ra khỏi phạm vi trước khi câu lệnh return bắt đầu.
Nếu bất kỳ hàm hủy nào cần được chạy sau lệnh gọi đuôi, thì việc tối ưu hóa cuộc gọi đuôi không thể được thực hiện.