satır içi, __inline, __forceinline
inline Ve __inline belirticileri işlevi çağrılırsa her yerde işlev gövdesi bir kopyasını eklemek için derleyici isteyin.
inline function_declarator;
__inline function_declarator; // Microsoft Specific
__forceinline function_declarator; // Microsoft Specific
Notlar
Ekleme (satır içi genişletme denir ya da inlining) derleyici 's maliyet/fayda analizi karlı olmasını Göster ortaya çıkar. Satır içi genişleme daha büyük kod boyutu, olası maliyetle yükü işlev çağrısı azaltır.
__forceinline Anahtar sözcüğünü maliyet/fayda analizi geçersiz kılar ve Programcı bağlı bunun yerine dayanır. Kullanırken dikkatli davranın __forceinline. İndiscriminate kullanımını __forceinline neden sadece Marjinal performans artışı ile daha büyük kod veya yapabilirsiniz, performans kayıpları (yüzünden karşılaştırıldığında daha büyük bir yürütülebilir dosya örneğin sayfalama) bazı durumlarda bile.
Bunlar işlev çağrıları ile ilişkili ek yükü ortadan kaldırdığı satır içi işlevleri kullanarak programınız daha hızlı yapabilirsiniz. Genişletilen satır içi işlevleri tabidir kod iyileştirmeleri normal işlevleri kullanılamaz.
Derleyici satır içi genişleme seçenekleri ve anahtar sözcükleri öneri olarak değerlendirir. İşlevleri inlined hiçbir garantisi yoktur. Satır içi belirli bir işlev için derleyici olsa da zorlayamaz __forceinline anahtar sözcüğü. İle derlerken /clr, derleyici işlevine uygulanan güvenlik öznitelikleri varsa bu değil satır içi işlev olur.
Satır içi anahtar sözcüğü yalnızca C++ uygulamasında kullanılabilir. __inline Ve __forceinline sözcükler c ve C++ içinde bulunur. Önceki sürümlerle uyumluluk için _inline eşanlamlıdır __inline.
Satır içi anahtar sözcük, satır içi genişletme tercih edilir derleyici söyler. Ancak, derleyici işlevi ayrı bir örneği oluşturabilirsiniz (örneklediğinizde) ve kodu satır içi eklemek yerine standart arama Gevþek oluşturun. Burada gerçekleşebilir iki durumda şunlardır:
Yinelemeli işlevler.
Çeviri birimi herhangi bir yerinde bir işaretçi ile başvurulan işlevler.
Bu nedenler ile karışabilir inlining, olabilir diğerleri olarak, derleyici; politikasına uygun size üzerinde bağımlı olmamalıdır satır içi inlined gibi bir işlev neden belirleyici.
Normal işlevleriyle olarak tanımlanan herhangi bir satır içi işlevi bağımsız değişkenlerinin değerlendirme sırası vardır. Aslında, bağımsız normal işlev çağrısı protokolü kullanılarak geçirildiğinde değerlendirilme sırası farklı olabilir.
/Ob derleyici iyileştirme seçeneği satır içi işlevi genişletme gerçekten oluşup oluşmadığını belirleyin yardımcı olur.
/ ltcg arası-modülü inlining, kaynak kodunda mı istendi bağımsız olarak gerçekleştirir.
Örnek 1
// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
if( a > b )
return a;
return b;
}
Bir sınıfın üye işlevler ya da kullanarak satır içi bildirilebilir satır içi anahtar sözcük veya sınıf tanımı içinde işlev tanımı yerleştirerek.
Örnek 2
// inline_keyword2.cpp
// compile with: /EHsc /c
#include <iostream>
using namespace std;
class MyClass {
public:
void print() { cout << i << ' '; } // Implicitly inline
private:
int i;
};
Microsoft özel
__inline Anahtar sözcük için eşdeğer satır içi.
Hatta ile __forceinline, her durumda satır içi kod derleyici olamaz. Derleyici, satır içi işlev yapamazsınız:
İşlev veya kendi arayan (hata ayıklama için varsayılan seçenek oluşturur) /Ob0 ile derlenir.
İşlev ve arayan farklı türde özel durum işleme (bir, yapılandırılmış özel durum işleme diğer özel durum İşlemede C++) kullanın.
Değişken bağımsız değişken listesi bir işlev vardır.
İşlevi satır içi derleme /Og, /Ox, /O1 veya /O2 ile derlenmiş sürece kullanır.
İşlevi özyinelemeli ise ve eşlik değil # pragma inline_recursion(on). Pragma ile yinelemeli işlevler 16 aramaları varsayılan derinliğini inlined. İnlining derinliğini azaltmak için inline_depth pragma.
İşlev, sanal ve neredeyse olarak adlandırılır. Sanal işlevler doğrudan çağrıları inlined olabilir.
Program işlevi adresini alır ve çağrı işlev işaretçisi aracılığıyla yapılır. Alınan kendi adresi olan işlevleri doğrudan çağrıları inlined olabilir.
İşlevi de ile işaretlenmiş çýplak__declspec değiştirici.
Satır içi derleyicisi olamaz, bir işlev ile bildirilen __forceinline, düzey 1 uyarı oluşturur.
Yinelemeli işlevler tarafından belirtilen bir derinlik için değiştirilen satır içi olabilir inline_depth maksimum 16 çağrıların pragma. Bu derinlik sonra özyinelemeli işlev çağrıları çağrıları işlev örneği olarak kabul edilir. Hangi özyinelemeli İşlevler, satır içi buluşsal yöntem tarafından incelenir derinliği 16 geçemez. İnline_recursion pragma işlevini genişletme altında şu anda satır içi genişlemesini kontrol eder. Bkz: Satır içi işlevi genişletme (/ Ob) ilgili bilgiler için derleyici seçeneği.
SON Microsoft özel
Daha fazla bilgi için satır içi belirleyici, bkz: