inline, __inline, __forceinline
Specyfikatory inline oraz __inline nakazują kompilatorowi wstawić kopię treści funkcji do każdego miejsca, gdzie funkcja jest wywoływana.
inline function_declarator;
__inline function_declarator; // Microsoft Specific
__forceinline function_declarator; // Microsoft Specific
Uwagi
Wstawianie (nazywane też wbudowanym rozwijaniem lub wbudowywaniem) występuje tylko w przypadku, gdy analiza kosztów i korzyści kompilatora pokaże, że jest to opłacalne.Wbudowane rozwijanie zmniejsza obciążenie wywołaniami funkcji kosztem potencjalnego zwiększenia rozmiaru kodu.
Słowo kluczowe __forceinline zastępuje analizator kosztów i korzyści i opiera się na ocenie programisty.Należy zachować ostrożność podczas korzystania z __forceinline.Niekontrolowane użycie __forceinline może spowodować zwiększenie kodu i tylko niewielki wzrost wydajności, lub w niektórych przypadkach nawet spadek wydajności (na przykład z powodu zwiększonego stronicowania pliku wykonywalnego).
Korzystanie z wbudowanych funkcji może przyspieszyć program ponieważ eliminuje ono obciążenie związane z wywołaniami funkcji.Rozwinięte funkcje podlegają optymalizacji kodu nie dostępnej dla normalnych funkcji.
Kompilator traktuje opcje wbudowanego rozwijania i słowa kluczowe jako sugestie.Nie ma żadnej gwarancji, że funkcje będą rozwinięte.Nie można wymusić na kompilatorze rozwinięcia określonej funkcji, nawet ze słowem kluczowym __forceinline.Podczas kompilowania z /clr, kompilator nie będzie rozwijał funkcji jeżeli zostały do nich zastosowane atrybuty zabezpieczeń.
Słowo kluczowe Inline jest dostępne tylko w języku C++.Słowa kluczowe __inline i __forceinline są dostępne w C i C++.W celu zachowania zgodności z poprzednimi wersjami _inline jest synonimem dla __inline.
Słowo kluczowe Inline informuje kompilator, że preferowane jest wbudowane rozwijanie.Jednak kompilator może utworzyć osobne wystąpienie funkcji i tworzyć standardowe powiązania wywołujące zamiast wstawiania kodu wbudowanego.Są dwa przypadki, gdzie jest to możliwe:
Funkcje rekurencyjne.
Funkcje, do których istnieją odwołania poprzez wskaźnik w innym miejscu jednostki tłumaczenia.
Przedstawione przyczyny mogą zakłócać wbudowywanie, tak samo jak inne, według uznania kompilatora; nie należy zakładać, że specyfikator inline spowoduje wbudowanie funkcji.
Podobnie jak w przypadku normalnych funkcji, nie istnieje zdefiniowana kolejności ewaluacji argumentów do wbudowanej funkcji.W rzeczywistości może być inna niż kolejność ewaluacji argumentów, gdy są one przekazywane za pomocą normalnego protokołu wywoływania funkcji.
Opcja optymalizacji kompilatora /Ob przyczynia się do ustalenia, czy rozwinięcie funkcji wbudowanej faktycznie występuje.
/ LTCG wykonuje międzymodułowe wbudowywanie niezależnie od tego, czy było ono wymagane 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ć deklarowana jako wbudowane inline albo za pomocą słowa kluczowego inline lub umieszczając definicję 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;
};
Specyficzne dla firmy Microsoft
Słowo kluczowe __inline jest równoważne z inline.
Nawet przy __forceinline, kompilator nie może wbudować kodu w każdych okolicznościach.Kompilator nie może wbudować funkcji, jeśli:
Funkcja lub wywołujący jest skompilowany z /Ob0 (domyślną opcją kompilacji w trybie debugowania).
Funkcja i wywołujący używają różnych typów obsługi wyjątków (obsługa wyjątków C++ w jednym przypadku, strukturalna obsługa wyjątków w drugim).
Funkcja ma zmienną listę argumentów.
Funkcja używa zestawu wbudowanego, chyba że została skompilowana z /Og, /Ox, /O1 lub /O2.
Funkcja jest rekurencyjna i nie posiada #pragma inline_recursion(on).Z dyrektywą pragma, funkcje rekurencyjne są wbudowywane na domyślną głębokość 16 wywołań.Aby zmniejszyć głębokość wbudowywania, użyj dyrektywy pragma inline_depth.
Funkcja jest wirtualna i wywoływana jest wirtualnie.Bezpośrednie wywołania funkcji wirtualnej mogą być wbudowywane.
Program pobiera adres funkcji a wywołanie jest wykonywane za pomocą wskaźnika do funkcji.Bezpośrednie wywołania funkcji, które miały pobrany adres mogą być wbudowane.
Funkcja jest również oznaczona modyfikatorem naked__declspec.
Jeśli kompilator nie może wbudować funkcji zadeklarowanej za pomocą __forceinline, generuje ostrzeżenie poziomu 1.
Funkcje rekurencyjne mogą być wbudowywane do głębokości określonej przez pragmę inline_depth do maksymalnie 16 wywołań.Po osiągnięciu tej głębokości, wywołania funkcji są traktowane jako wywołania instancji funkcji. Głębokość, do której funkcje rekurencyjne są badane przez heurystyki wbudowywania, nie może przekraczać 16.Pragma Inline_recursion kontroluje wbudowane rozwijanie aktualnie rozwijanej funkcji.Zobacz opcję kompilatora Rozszerzenie funkcji wbudowanej (/ Ob), aby uzyskać odpowiednie informacje.
KONIEC informacji specyficznych dla firmy Microsoft
Aby uzyskać więcej informacji dotyczących używania specyfikatora inline, zobacz: