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: