C++'de sınıf üye fonksiyonu şu şekilde ilan edilebilir:
Sınıf içinde (inline tanım):
class A { void foo() { /* ... */ } // doğrudan sınıf içinde };
Bu tür fonksiyonlar otomatik olarak inline olarak kabul edilir.
Sınıf içinde (sadece ilan):
class A { void foo(); // sadece ilan }; void A::foo() { /* ... */ } // sınıf dışında tanım
Fark:
inline kabul edilir, derleyici bu tür bir fonksiyonu doğrudan çağrıldığı koda yerleştirebilir.inline değildir, açık bir belirti olmadan (inline), ancak anahtar kelime eklenebilir:
inline void A::foo() { /* ... */ }
Yaklaşımların Avantajları ve Dezavantajları:
Sınıf içinde tanımlanan bir fonksiyon, her zaman derleyici tarafından gerçekten yerleştirilecek mi?
Cevap: Hayır. inline anahtar kelimesi (sınıf içinde tanımlandığında örtük atama da dahil) yalnızca derleyiciye bir tavsiyedir. Derleyici, fonksiyonu aşırı karmaşık veya yerleştirmeye uygun olmadığını düşünürse bu tavsiyeyi göz ardı edebilir.
Hikaye 1
Büyük bir projede, üye fonksiyonları header dosyaları içinde
inlineolarak tanımlandı ve binlerce çeviri birimine dahil edildi; bu nedenle derleme süresi birkaç kat arttı ve ikili dosyanın boyutu kod tekrarı nedeniyle yükseldi — derleyici her zaman özdeş makine uygulamalarını birleştirmiyor.
Hikaye 2
Uygulamayı hızlandırma çabasında, geliştirici sınıfın tüm mantığını ilanına ( .h dosyasına) taşıdı. Bu, bir fonksiyonda değişiklik yapıldığında tüm projenin yeniden derlenmesine yol açtı, sadece etkilenen dosyalar değil (entegre edilen gerçek dosyalar).
Hikaye 3
Ekipteki yeni bir üye uzun seri hale getirme ve dosyayla çalışma yöntemlerini doğrudan şablon sınıfının ilanına yerleştirdi, bu da tüm TU'lar arasında hataların yayılmasına ve yürütülebilir dosyanın boyutunun gereksiz şekilde artmasına neden oldu, performansta bir artış olmaksızın.