Tampaknya bagi saya itu akan bekerja dengan sangat baik untuk melakukan optimasi rekursi ekor di C dan C ++, namun saat debugging saya sepertinya tidak pernah melihat frame stack yang menunjukkan optimasi ini. Itu agak bagus, karena tumpukan memberi tahu saya seberapa dalam rekursi itu. Namun, pengoptimalan juga akan menyenangkan.
Apakah ada kompiler C ++ yang melakukan optimasi ini? Mengapa? Kenapa tidak?
Bagaimana cara saya memberitahu kompiler untuk melakukannya?
- Untuk MSVC:
/O2
atau/Ox
- Untuk GCC:
-O2
atau-O3
Bagaimana kalau memeriksa apakah kompiler telah melakukan ini dalam kasus tertentu?
- Untuk MSVC, aktifkan output PDB untuk dapat melacak kode, lalu periksa kodenya
- Untuk GCC ..?
Saya masih akan mengambil saran untuk bagaimana menentukan apakah fungsi tertentu dioptimalkan seperti ini oleh kompiler (meskipun saya merasa meyakinkan bahwa Konrad menyuruh saya untuk menganggapnya)
Selalu mungkin untuk memeriksa apakah kompiler melakukan ini sama sekali dengan membuat rekursi tak terbatas dan memeriksa apakah itu menghasilkan infinite loop atau stack overflow (saya melakukan ini dengan GCC dan menemukan itu -O2
sudah cukup), tapi saya ingin menjadi mampu memeriksa fungsi tertentu yang saya tahu akan berakhir pula. Saya ingin memiliki cara mudah untuk memeriksa ini :)
Setelah beberapa pengujian, saya menemukan bahwa destruktor merusak kemungkinan melakukan optimasi ini. Kadang-kadang layak untuk mengubah cakupan variabel dan temporal tertentu untuk memastikan mereka keluar dari ruang lingkup sebelum pernyataan pengembalian dimulai.
Jika ada destructor yang perlu dijalankan setelah tail-call, optimasi tail-call tidak dapat dilakukan.