Aracılığıyla paylaş


inline, __inline, __forceinline

Bu inline ve __inline tanımlayıcıları işlevin çağrıldığında her yerde derleyiciye işlev gövdesinin bir kopyasını eklemek için talimat verir.

inline function_declarator;   
__inline function_declarator;   // Microsoft Specific
__forceinline function_declarator;   // Microsoft Specific

Notlar

Ekleme (satır içi genişletme veya katıştırma denir) yalnızca derleyicinin maliyet/kar analizinin karlı olmasını gösterdiği durumlarda oluşur.Satır içi genişletme, daha büyük boyuttaki kodun olası maliyetinde işlev-çağrısı ek yükünü azaltır.

Bir __forceinline anahtar sözcüğünü maliyet/kar analizini geçersiz kılar ve bunun yerine programcının kararına dayanır.Bir __forceinline kullanırken dikkatli çalışın.Bir __forceinline rasgele kullanımı daha büyük kodun yalnızca marjinal performans artışı ile sonuçlanabilir ya da, bazı durumlarda performans kayıplarına neden olabilir (örneğin büyük çalıştırılabilir belleğin artması ).

Satır içi işlevler, işlev çağrıları ile ilgili ek yükü ortadan kaldırdığı için bunları kullanmanız programınızı daha hızlı yapabilir.Genişletilen satır içi işlevlerinin kod iyileştirmeleri normal işlevler için kullanılamaz.

Derleyici satır içi genişleme seçeneklerine ve anahtar sözcüklerine öneri olarak davranır.İşlevlerin satır içi olacağına dair bir garanti yoktur.Bir __forceinline anahtar sözcüğünü kullansanız bile belirli bir işlevin satır içi olması için derleyiciyi zorlayamazsınız.Bir /clrile derlerken, uygulanan işlevin güvenlik öznitelikleri varsa derleyici işlevi satır içi işlev yapmayacaktır.

Bir satır içi anahtar sözcüğü yalnızca C++'ta kullanılabilir.Bir __inline ve __forceinline anahtar sözcükleri hem C'de hem de C++'ta kullanılabilir.Önceki sürümlerle uyumluluk için satır içi ile __inline eşanlamlıdır.

Bir satır içi anahtar sözcüğü derleyiciye satır içi genişletmelerin tercih edildiğini bildirir.Ancak, derleyici işlevin ayrı bir örneği oluşturabilir (örneklediğinizde) ve satır içi kod eklemek yerine standart arama raporlarını oluşturur.Burada buna izin veren iki durum vardır:

  • Yinelemeli işlevler

  • Çeviri birimi içindeki başka bir yerdeki işaretçi üzerinden başvurulan işlevler.

Bu nedenler katıştırma ile karıştırılabilir başkalarının olabildiği, derleyicinin eklenmesinde işlevin satır içi olması için satır içi tanımlayıcısına bağımlı olmamalısınız.

Normal işlevlerde, satır içi işlevler için bağımsız değişkenlerin değerlendirilmesinde belirlenmiş bir sıra yoktur.Aslında, bağımsız değişkenlerin normal işlev çağrısı protokolü kullanılarak geçirildiği durumların değerlendirilmesinde sıralamadan farklı olabilir.

Bir /Ob derleyicisi iyileştirme seçeneği satır içi işlev genişletmesinin gerçekten oluşup oluşmadığını belirlemek için yardımcı olur.

Kaynak kodunda istenip istenmediğinden bağımsız olarak, / LTCG çapraz modül katıştırmasını 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şlevleri satır içi anahtar sözcüğünü kullanarak veya sınıf tanımı içinde işlev tanımını yerleştirerek satır içi olarak bildirilebilirler.

Ö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'a Özgü

Bir __inline anahtar sözcüğü satır içi'ne eşdeğerdir.

Bir __forceinlineile olsa da, derleyici her durumda satır içi kodlamayı yapamaz.Derleyici, satır içi işlevi şu durumlarda yapamaz:

  • İşlev veya çağıranı /Ob0 (hata ayıklama için varsayılan seçenek) ile derlenir.

  • İşlev ve çağıran farklı türde özel durum işlemelerini kullanır (birinde C++ özel durum işlemesi, diğerinde yapı özel durum işlemesi).

  • İşlevin değişken bağımsız değişken listesi vardır.

  • İşlev satır içi bütünleştirilmiş kodu, /Og, /Ox, /O1 veya /O2 ile derlendiği sürece kullanır.

  • İşlevi özyinelemelidir ve **#pragma inline_recursion(on)**tarafından eşlik edilmez.Pragma ile özyinelemeli işlevler varsayılan 16 aramalı derinliğe katıştırılırlar.Katıştırma derinliğini azaltmak için inline_depth pragmasını kullanın.

  • İşlev sanaldır ve sanal olarak adlandırılır.Sanal işlevlere doğrudan çağrılar katıştırılabilir.

  • Program işlevin adresini alır ve çağrı işlev işaretçisi aracılığıyla yapılır.Adresleri alınmış olan doğrudan işlev çağrıları katıştırılabilir.

  • İşlev ayrıca çıplak__declspec değiştiricisi ile işaretlenir.

Bir __forceinlineile bildirilen satır içi işlevi katıştıramaz ise, düzey 1 uyarısını oluşturur.

Özyinelemeli işlevler inline_depth pragması tarafından belirlenen, en çok 16 çağrısı olabilen derinliğe satır içi olarak değiştirilebilir.Bu derinlikten sonra yinelenen işlev çağrıları, işlev örneği çağrıları olarak kabul edilir. Özyinelemeli işlevlerin derinliği 16'yı geçmeyecek şekilde satır içi buluşsal yöntem tarafından incelenir.Bir inline_recursion pragması şu anda genişletilen işlevin satır işi genişletmesini denetler.Bkz: Satır İçi-İşlev Genişletme (/ Ob) derleyici seçeneğiyle ilgili bilgi için

END Microsoft'a Özgü

Bir satır içi tanımlayıcısı hakkında daha fazla bilgi için, bkz:

Ayrıca bkz.

Başvuru

C++ Anahtar Sözcükleri

noinline

auto_inline