Bana öyle geliyor ki hem C hem de C ++ 'da kuyruk özyineleme optimizasyonu yapmak çok iyi çalışır, ancak hata ayıklama sırasında asla bu optimizasyonu gösteren bir çerçeve yığını görmüyorum. Bu iyi bir şey, çünkü yığın bana özyinenin ne kadar derin olduğunu söylüyor. Ancak, optimizasyon da hoş olurdu.
Bu optimizasyonu herhangi bir C ++ derleyicisi yapıyor mu? Neden? Neden olmasın?
Derleyiciye bunu yapmasını nasıl söyleyebilirim?
- MSVC için:
/O2
veya/Ox
- GCC için:
-O2
veya-O3
Derleyicinin bunu belirli bir durumda yapıp yapmadığını kontrol etmeye ne dersiniz?
- MSVC için, PDB çıkışının kodu izleyebilmesini sağlayın, ardından kodu inceleyin
- GCC için ..?
Derleyici tarafından belirli bir işlevin bu şekilde optimize edilip edilmediğini nasıl belirleyeceğimi hala öneriyorum (Konrad'ın bunu üstlenmemi söylediğine dair güven verici bulsam da)
Derleyicinin bunu sonsuz bir özyineleme yapıp sonsuz bir döngü veya yığın taşmasıyla sonuçlayıp sağlamadığını kontrol etmek her zaman mümkündür (bunu GCC ile yaptım ve -O2
yeterli olduğunu öğrendim ), ama olmak istiyorum Sonlandırılacağını bildiğim belirli bir işlevi kontrol edebilir. Bunu kontrol etmenin kolay bir yoluna sahip olmak isterim :)
Bazı testlerden sonra, yıkıcıların bu optimizasyonu yapma olasılığını mahvettiğini keşfettim. Dönüş ifadesi başlamadan önce kapsam dışına çıktıklarından emin olmak için bazen belirli değişkenlerin ve geçici programların kapsamını değiştirmek faydalı olabilir.
Kuyruk çağrısından sonra herhangi bir yıkıcı çalıştırılması gerekiyorsa, kuyruk çağrısı optimizasyonu yapılamaz.