Bir işlev çağrısının maliyetinden kaçınmak hikayenin sadece yarısıdır.
yapmak:
inline
yerine kullan#define
- çok küçük işlevler aşağıdakiler için iyi adaylardır
inline
: daha hızlı kod ve daha küçük yürütülebilir dosyalar (kod önbelleğinde kalma şansı daha yüksektir)
- işlev küçüktür ve çok sık çağrılır
yok:
- büyük işlevler: daha büyük yürütülebilir dosyalara yol açar, bu da çağrı yükünden kaynaklanan daha hızlı yürütme işleminden bağımsız olarak performansı önemli ölçüde etkiler
- G / Ç bağlantılı satır içi işlevler
- işlev nadiren kullanılır
- yapıcılar ve yıkıcılar: boş olsa bile, derleyici onlar için kod üretir
- kitaplıklar geliştirirken ikili uyumluluğu bozma:
- varolan bir işlevi satır içinde
- satır içi işlevi değiştirme veya satır içi işlevi satır içi olmayan yapma: kitaplığın önceki sürümü eski uygulamayı çağırır
bir kütüphane geliştirirken, bir sınıfı gelecekte genişletilebilir yapmak için:
- gövde boş olsa bile satır içi olmayan sanal yıkıcı ekle
- tüm kurucuları satıriçi yapma
- sınıf değere göre kopyalanamazsa, kopya oluşturucu ve atama işlecinin satır içi olmayan uygulamalarını yazma
inline
Anahtar kelimenin derleyiciye bir ipucu olduğunu unutmayın : derleyici bir işlevi satır içine almamaya karar verebilir inline
ve ilk etapta işaretlenmemiş satır içi işlevleri kullanmaya karar verebilir . Genellikle işaretleme işlevinden kaçınırım inline
(belki çok çok küçük işlevler yazarken).
Performans hakkında, akıllıca yaklaşım (her zamanki gibi) uygulamayı profillemek, daha sonra da inline
bir darboğazı temsil eden bir dizi işlevdir.
Referanslar:
EDIT: Bjarne Stroustrup, C ++ Programlama Dili:
Bir işlev olarak tanımlanabilir inline
. Örneğin:
inline int fac(int n)
{
return (n < 2) ? 1 : n * fac(n-1);
}
inline
Belirteci o bir çağrı için kodu oluşturmak girişiminde gerektiğini derleyiciye bir ipucu fac()
kez işlev kodu bırakmasını ve sonra her zamanki işlev çağrısı mekanizması yoluyla çağırmaktan daha inline ziyade. Akıllı bir derleyici 720
çağrı için sabit üretebilir fac(6)
. Karşılıklı olarak yinelenen satır içi işlevler, girdiye bağlı olan veya olmayan satır içi işlevler, vb inline
. Olasılığı , bir işlevin her çağrısının aslında satır içi olduğunu garanti etmeyi imkansız hale getirir . Bir derleyicinin akıllılık derecesi yasallaştırılamaz, bu nedenle bir derleyici 720
diğerini 6 * fac(5)
, hatta diğeri eğik olmayan bir çağrı oluşturabilir fac(6)
.
Alışılmadık derecede akıllı derleme ve bağlantı tesislerinin yokluğunda satırlamayı mümkün kılmak için, satır içi bir işlevin tanımı –ve sadece beyanı değil- kapsam dahilinde olmalıdır (§9.2). Bir inline
tanımlayıcı bir işlevin anlambilimini etkilemez. Özellikle, bir satır içi işlev hala benzersiz bir adrese sahiptir ve bu nedenle static
satır içi bir işlevin değişkenleri (§7.1.2) vardır.
EDIT2: ISO-IEC 14882-1998, 7.1.2 İşlev tanımlayıcıları
Bir inline
belirteci içeren işlev bildirimi (8.3.5, 9.3, 11.4) satır içi işlevi bildirir. Satır içi belirteç, uygulamaya, çağrı noktasında fonksiyon gövdesinin satır içi ikamesinin olağan fonksiyon çağrısı mekanizmasına tercih edileceğini belirtir. Çağrı sırasında bu satır içi yerine koymayı gerçekleştirmek için bir uygulama gerekli değildir; ancak, bu satır içi ikame atlanmış olsa bile, 7.1.2'de tanımlanan satır içi işlevler için diğer kurallara yine de uyulacaktır.
inline
C +CFLAGS
-O3 -funroll-loops -finline-functions