2015-01-19 38 views
5

Sıklıkla kodun başlığa yerleştirilmesinin kötü bir uygulama olduğunu duydum, ancak kısmen derleyicinin daha iyi optimize edilmesine yardımcı olmak için başlıklara kısa işlevler yerleştirmek yaygındı.Modern bir C/C++ derleyici, başlıktaki kodla daha iyi optimize edilebilir mi?

Satır içi anahtar kelimeler, derleyicinin hangi işlevlerin satır içi olarak belirtilmesi gerektiğini belirlemesine yardımcı olabilir, ancak bundan başka, başlıklarda kısa performans kritik işlevlerine sahip olmanın bir nedeni var mı? Yoksa modern derleyiciler için artık bir önemi yok mu?

+1

Bir üstbilgi dosyası eklediğinizde, önişlemci tam olarak içerdiği kodu kopyalayıp yapıştırır. – Andrew

+0

Burada bir göz atmanızı öneriyorum: http://programmers.stackexchange.com/questions/180904/are-header-files-actually-good –

+1

'inline' çoğunlukla C++ 'da bu kodu inline bağlantı zaman adı çarpışmalarının nasıl çözüleceği ile ilgili daha fazla şey var. "Kod satır içi" koymak C++ standardı bağlamında çok az anlam ifade etmektedir. – Yakk

cevap

4

Teknik olarak, inline anahtar kelimesi, yalnızca tanımın birden çok çeviri biriminde izinli olduğu anlamına gelir. Yani, bir başlık dosyasında tanımlanmış bir satır içi işleve sahipseniz ve bu başlık birden çok kaynak dosyaya eklendiyse, bu iyi olur. Satır içi olmayan, şablon olmayan bir işlev için, bu geçersiz olur.

Ancak derleyiciler, çağrılan işlevin kodunu görebilmekten yararlanabilir ve yararlanabilirler. Bu, yalnızca satır içi işlevler için değil, aynı zamanda kodu görülebilen diğer işlevler için de geçerlidir. Çoğu derleyici, kodu satır içi tutup koymayacağınıza dair iyi bir tahminde bulunmaya çalışır. Kodun satır içi olması, programı daha büyük veya daha küçük, daha hızlı veya daha yavaş hale getirebilir. Derleyici, kod satır içi olduğunda kodun hem daha hızlı hem de daha küçük olacağını belirleyebilirse, o zaman bunu yapar. Aksi taktirde bu işlemin dikkate alınması gerekir.

Birçok modern derleyici, bağlantı süresi optimizasyonu gerçekleştirebilir; burada başlangıçta belirtilmeyen kod, bağlantı sırasında bazı maliyetlerle bağlantı aşamasında satırlara eklenebilir. Bağlantı zamanına kadar ertelendiğinde kaybolan belirli optimizasyon fırsatları olabilir.

Kendi deneyimlerimde, küçük işlevlerin inline olması, genellikle hem boyut hem de hız için her zaman bir kazanç olduğunu fark ettim. Daha büyük işlevler için, programların daha hızlı ama daha büyük olmasını sağladığını görüyorum, ancak programların daha yavaş ve daha büyük olmasını nadiren de gördüm. Belirli bir işlevin performansı önemliyse, satır içi veya satır içi seçim yapmanıza yardımcı olacak ölçümler yapmanız gerekir.

+0

İyi bilgi. Buradaki anahtar parça, "derleyiciler çağrılan işlevin kodunu görebilmekten yararlanabilir ve yararlanabilirler", ve bunun link-time/tam program optimizasyonu ile de doğru olduğunu söyleyebiliriz.Bununla sadece akılda tutulabilirlikle başa çıkmayı umuyordum, ama söyledikleriniz mantıklı ve her zamanki gibi gerçek kıyaslama için bir yedek yok gibi görünüyor. Çok teşekkürler! –