Thread overview
C++ - inline Anahtar Kelimesi İle İlgili Suallerim
Jul 05, 2016
İbrahim
Jul 09, 2016
kerdemdemir
July 05, 2016

Selamün Aleyküm, Hayırlı Bayramlar;

1-) C++'da inline anahtar kelimesinin fonksiyonun içerisine girmek yerine fonksiyon içeriğinin fonksiyonun çağrıldığı yere kopyalandığını biliyoruz lakin bunun çalışıp çalışmadığını nasıl anlayabiliriz? inline kullanımını neye göre belirlemeliyiz?

2-) static olan (üye) fonksiyonlarda inline anahtar sözcüğü kullanılır mı? Yani inline static Tip FonksiyonAdı() şeklinde kullanmak bize fayda sağlar mı? (Bu şekilde kod çalışıyor lakin faydası var mı?). Teşekkürler!

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 05, 2016

inline sözcüğü için seneler öncesinden beri "bir tür boşluk karakteri" diye söz edilirdi (etkisiz olduğu için.) Günümüzdeki karmaşık mikroişlemci teknolojileri göz önüne alındığında böyle bir eniyileştirme kararını programcının derleyiciden daha iyi yapabileceği düşünülmüyor. C++ derleyicileri inline sözcüğünü hiç dikkate almayabilirler. (Hem dil kuralı olarak hem uygulama olarak.)

Herhangi bir işlevin inline olup olmadığını anlamanın en iyi yolu, derleyicinin ürettiği assembly çıktısına bakmaktır.

static'le kullanımında dil kuralı açısından bir fark yok. Yarar getirip getirmediğini de ölçerek görmek gerek.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 09, 2016

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