Udostępnij za pośrednictwem


wbudowane, __inline, __forceinline

inline i __inline Specyfikatory nakazać kompilatorowi, aby wstawić kopię w treści funkcji do każdego miejsca, funkcja jest wywoływana.

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

Uwagi

Wstawiania (nazywane ekspansji wbudowany lub inline) występuje tylko wtedy, gdy analizy kosztów i korzyści przez kompilator wskazują, iż być korzystne.Wbudowany rozszerzenia pozwala uniknąć wywołania funkcji narzuty na potencjalne koszt większy rozmiar kodu.

__forceinline Słowa kluczowego zastępuje analizę kosztów i korzyści i opiera się na wyrok programista zamiast.Zachowaj ostrożność podczas korzystania z __forceinline.Niekontrolowane stosowanie __forceinline może spowodować większe kodu tylko wzrost wydajności kredytu marginalnego lub, w niektórych przypadkach nawet spadek wydajności (ze względu na zwiększone stronicowania większych pliku wykonywalnego, na przykład).

Za pomocą wbudowanej funkcji można wprowadzać program szybciej, ponieważ eliminują one obciążenia związanego z wywołania funkcji.Rozszerzona wbudowane funkcje podlegają optymalizacji kodu nie jest dostępna do normalnej pracy.

Kompilator traktuje wbudowane opcje rozwinięcia i słowa kluczowe jako sugestie.Nie ma żadnej gwarancji, że funkcje będą inlined.Nie można wymusić na kompilatorze inline określonej funkcji, nawet z __forceinline słowa kluczowego.Podczas kompilowania z /clr, kompilator będzie nie wbudowanej funkcji Jeśli atrybuty zabezpieczeń stosowane do funkcji.

Inline słowo kluczowe jest dostępne tylko w języku C++.__inline i __forceinline słowa kluczowe są dostępne zarówno w c i C++.Dla zgodności z poprzednimi wersjami _inline jest synonimem dla __inline.

Inline słowa kluczowego informuje kompilator, że rozszerzenia wbudowany jest preferowany.Jednak kompilator można utworzyć osobne wystąpienie funkcji (wystąpienia) i utworzyć standardowy powiązań wywołującego zamiast wstawiania w wierszu kodu.Są dwa przypadki, gdzie jest to możliwe:

  • Funkcje cykliczne.

  • Funkcje, które są określone za pomocą wskaźnika gdzie indziej w jednostce tłumaczenia.

Z tych powodów mogą zakłócać inline, jako może inni, według uznania kompilatora; nie powinien zależeć inline specyfikatora, aby spowodować, że funkcja inlined.

Podobnie jak w przypadku normalnej funkcji istnieje niezdefiniowanej kolejności oceny argumentów dla funkcji śródwierszowej.W rzeczywistości może być inna niż kolejność, w którym argumenty są oceniane, gdy dane są przekazywane za pomocą protokołu wywołanie funkcji normalnych.

/Ob opcji optymalizacji kompilatora pomaga ustalić, czy występuje faktycznie wbudowanej funkcji rozszerzeń.

/ LTCG wykonuje cross moduł inline, niezależnie od tego, czy wniosek został w kodzie źródłowym.

Przykład 1

// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
   if( a > b ) 
      return a;
   return b;
}

Funkcje składowe klasy może być zadeklarowana albo przy użyciu wbudowanego inline słowa kluczowego lub umieszczając definicji funkcji w ramach definicji klasy.

Przykład 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;
};

Programu Microsoft

__inline Słowo kluczowe jest równoważne z inline.

Nawet w przypadku __forceinline, kompilator nie kodu wbudowanego w każdych okolicznościach.Kompilator nie wbudowanych funkcji, jeśli:

  • Funkcja lub jego rozmówcy została skompilowana z /Ob0 (opcja domyślna dla debugowania buduje).

  • Funkcja i wywołujący używają różnych typów (obsługę wyjątków C++ w jednym, strukturalnej obsługi wyjątków w drugiej) obsługi wyjątków.

  • Funkcja ma listę zmiennych, argument.

  • Funkcja używa zestawu wbudowany, chyba że skompilowany z /Og, /Ox, /O1 lub /O2.

  • Funkcja jest rekurencyjna i nie towarzyszy inline_recursion(on) # pragma.Pragma funkcje rekurencyjne są inlined na głębokość domyślne wywołania 16.Aby zmniejszyć głębię inline, użyj inline_depth pragma.

  • Funkcja jest wirtualna i nazywa się praktycznie.Bezpośrednie wywołania funkcji wirtualne mogą być inlined.

  • Program pobiera adres funkcji i połączenie jest nawiązywane za pomocą wskaźnika do funkcji.Bezpośrednie wywołania funkcji, które miały ich adres podjęte mogą być inlined.

  • Funkcja jest również oznaczone naked__declspec modyfikator. 

Jeśli kompilator nie wbudowanej funkcji zadeklarowanych z __forceinline, generuje ostrzeżenie poziomu 1.

Funkcje cykliczne może być podstawione wbudowane do głębokości, określonej przez inline_depth pragma maksymalnie 16 wywołań.Po tym głębokość wywołania funkcji cyklicznej są traktowane jako wywołania funkcji instancji.Głębokość do cykliczne, które funkcje są badane przez heurystyki wbudowanego nie może przekraczać 16.Inline_recursion pragma kontroluje ekspansji wbudowanej funkcji aktualnie w obszarze rozszerzenia.Zobacz Rozszerzenia funkcji śródwierszowej (/ Ob) opcję kompilatora, aby uzyskać pokrewne informacje.

KONIEC Microsoft szczególne

Aby uzyskać więcej informacji o korzystaniu z inline specyfikatora, zobacz:

Zobacz też

Informacje

Słów kluczowych języka C++

noinline

auto_inline