Peki, önce bazı varsayımlarınızı yıkalım:
- Yalnızca üstbilgi kitaplıkların C ++ için avantajlarından biri, ayrı olarak derlenmelerine gerek olmamasıdır.
Bir şeyleri ayrı ayrı derlemek, sadece bir parça değişirse potansiyel olarak her şeyi yeniden derlemek zorunda kalmamak anlamına gelir.
Yani bir avantaj yerine dezavantaj.
- C ve C ++ 'da satır içi yalnızca işlev bir başlık dosyasında tanımlanmışsa anlamlıdır *.
Evet, kalan tek etki tek tanım kuralınıninline
istisnasıdır .
Bu tanımların yine de herhangi bir şekilde farklı olup olmadığını size söyleyin.
Bu nedenle, bir fonksiyon derleme ünitesinin içindeyse, onu işaretleyin static
. Bu aynı zamanda, satır içi işlevinin kullanılabilir olması gerektiğinden, satır içi işlemi daha olası kılar.
Yine de, en azından MSVC ++, gcc ve clang tarafından desteklenen link-time optimizasyonuna bir göz atın.
- Geleneksel olarak, C, .c / .h düzeni kullanılmıştır, burada başlığın çeviri biriminin asgari ortak arayüzünü temsil ettiği görülmektedir. Benzer şekilde, .cpp / hpp.
Eh, sadece asgari arayüzü sunmak, daha yüksek API ve ABI kararlılığı sağlamak ve derleme sürelerini en aza indirmek için kesinlikle amaçlardan biridir.
Özellikle C ++ sınıfları, tüm özel bitler başlığa sızdıklarından korunanlara göre türetmek isteyip istemediğinize göre, gerçekten de buna uygun değildir.
Tasarım deseni PIMPL , bu tür ayrıntıları azaltmak içindir.
Arayüz ve uygulamanın birbirinden ayrılmasının C ++ 'da tamamen başarısız olduğu kısım yine de şablonlardır.
Komite, dışa aktarılan şablonlarla bir şeyler yapmaya çalıştı ancak bu çok karmaşık ve gerçekten çalışmadığı için terk edildi.
Şimdi, yavaş ilerlemesine rağmen düzgün bir modül sistemi üzerinde çalışıyorlar . Bu derleme sürelerini ciddi şekilde azaltır ve ayrıca yüzeylerini azaltarak API ve ABI dengesini de arttırmalıdır.
Yalnızca üstbilgi kitaplıkları genellikle geleneksel düzenden daha verimli kod ve yürütme süresi açısından daha akıllıca mıdır? Eğer öyleyse, bunun nedeni kapsamlı satır içi veya diğer optimizasyonlardan mı?
Yalnızca üstbilgi kitaplıkları, kod boyutunda ve yürütme zamanında daha verimli olabilir; ancak bu, kitaplığın paylaşılıp paylaşılmadığına, ne kadarının kullanıldığına, hangi şekillerde kullanılacağına ve satır içi yapmanın bu belirli durumda belirleyici bir kazanım sağlayıp sağlamadığına bağlı olarak değişir.
Ve inlining'in optimizasyon için çok önemli olmasının sebebi, inline etmenin kendisinin çok büyük bir destek olması değil, sürekli yayılma ve daha fazla optimizasyon fırsatları nedeniyle ortaya çıkmasıdır.