Selamlar!!
Benim aklıma eklemeye değicek bir şey geldi paylaşmak istedim.
ODR(One Definition Rule) dolayısıyla bir fonksiyon birden fazla tanımlamaz. Yani bir kere tanımladığımız fonksiyonu başka bir header dosyasında bir daha tanımlamaya çalışırsak bir compile hatası alırız.
Aynı anda geçmişten gelen bağımlılıklardan dolayı C++ 'da modüller yerine .h ve .cpp dosyaları var. Bazen benim gibi tembel programcılar sadece .h yazmak istiyorlar. Fakat eğer bu header dosyası iki yerde include edilirse ODR bozulmuş oluyor. Header dosyasını include etmek biraz copy paste gibi etkisi olduğundan dolayı hata alıyoruz.
Bu durumda eğer header dosyasına yazdığımız fonksiyonu inline olarak tanımlarsak; compiler fonksiyon tanımlaması yerine fonskitonun çağrıldığı her yere fonksiyonun derlenmesi sonuçu oluşturulan makine kodunu direk gömüyor. Bu bir tanımlama olarak sayılmadığından ODR bozulmamış oluyor.
Eğer fonskiyon eğer sınıf "method"'u ise eğer inline kelimesi koymasak bile compiler direk inline keyword unu koyuyor.
Bu kullanımı hariç inline kelimesinin Ali Hocamızın belirttiği gibi compiler'a bırakılması daha iyi .Çünkü fonksiyon çağrısı yerine çağrılan fonksiyonun makine kodlarının gömülmesi, çağrı yapılan fonksiyonun büyümesine neden oluyor. Eğer fonksiyon çok fazla büyürse bu "Cache miss" ve hatta "Page miss" gibi etkiler dolasıyla performans düşüşü olabiliyor.
Yani üç kuruşluk fonksiyon çağırma maliyetinden kaçmaya çalışırken koskaca bir Ram'e gitme masrafına girebiliyoruz.
Bu konuda D dilininde kurucularından Andrei Alexandrescu'un 2014 C++ konferansında verdiği güzel bir konuşma vardı: https://www.youtube.com/watch?v=Qq_WaiwzOtI belki vaktiniz olur.
Sevgiler
Erdemdem
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]