ProgramlamaC++ Geliştirici / Sistem Programcısı

C++'ta inline fonksiyonlar nedir, inline anahtar kelimesi nasıl çalışır? Büyük derlemelerde inline fonksiyonların aşırı kullanımının gerçek kısıtlamaları ve riskleri nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Inline fonksiyonlar — derleyicinin (ama zorunlu değil) fonksiyon çağrısını, çağrı yerinde fonksiyonun kodunu doğrudan yerleştirerek değiştirebileceği fonksiyonlardır. Bunun için inline anahtar kelimesi kullanılır.

  • inline anahtar kelimesi derleyiciye bir öneri sunar, ancak zorunluluk getirmez: fonksiyon çok karmaşık olduğunda göz ardı edilebilir.
  • Gerçekte, sınıf içinde tanımlanan fonksiyonlar varsayılan olarak inline kabul edilir.
  • Inline fonksiyonlar sıkça çağrılan kısa fonksiyonlar için kullanılır, çağrı yüklerini önlemek amacıyla.

Kısıtlamalar ve riskler:

  • Çok sayıda çağrı ve aynı başlık fonksiyonunun farklı dosyalara dahil edilmesi durumunda kodun sıkça çoğaltılması, ikili dosyanın boyutunu önemli ölçüde artırabilir.
  • Karmaşık fonksiyonlar veya diğer inline fonksiyonları çağıran fonksiyonlar, derleyici tarafından inline olarak genişletilmeyebilir.

Örnek:

inline int add(int a, int b) { return a + b; } struct X { int get() const { return value; } int value; }; // get() inline olarak değerlendirilecektir

Çeldirici bir soru.

Soru: Inline anahtar kelimesi, fonksiyonun tüm çağrı noktalarında yerleştirileceğini garanti eder mi?

Cevap: Hayır. Derleyici, fonksiyonu inline olarak yerleştirip yerleştirmeyeceğine kendi içsel sezgilerine dayanarak karar verir. inline yalnızca bir tavsiyedir.

Konunun inceliklerini bilmemekten kaynaklanan bazı gerçek hatalar.


Hikaye

Finansal sistemde, on binlerce büyük inline fonksiyona sahip sıkça kullanılan bir logger yazıldı. Sistem büyüdükçe, ikili dosyanın boyutu katlanarak arttı, bu da bağlantı zamanının uzamasına ve sunucudaki önbellek verimliliğinin azalmasına yol açtı.


Hikaye

Çapraz platform yazılımına geçiş sırasında, bazı derleyicilerin (örneğin, MSVC ve GCC) inline'ı farklı şekilde işlemek için kullanımda olduğu, bazı fonksiyonların inline olarak genişletilmediği, bazılarının ise aksi şekilde davrandığı, bu durumun platformlar arasında hız ve uygulama boyutlarında tekrar edilemez farklılıklara neden olduğu tespit edildi.


Hikaye

Geliştirici sadece başlık dosyasında inline fonksiyonlar ilan etti, ancak uygulamayı ayrı bir cpp dosyasına taşıdı. Sonuç olarak, bağlantı sırasında multiple definition veya unresolved external hataları meydana geldi, çünkü inline fonksiyonların başlıklarda tanımlanması gerekirdi.