vložené, __inline, __forceinline
inline a __inline specifikátory pokyn do každé místo je zavolána funkce Vložit kopii těla funkce kompilátoru.
inline function_declarator;
__inline function_declarator; // Microsoft Specific
__forceinline function_declarator; // Microsoft Specific
Poznámky
Kurzor (nazývané rozšiřující vložené nebo inlining) dochází pouze v případě, že analýza nákladů a přínosů kompilátoru jeví jako ziskové.Rozšiřující vložené řeší volání funkce režie na potenciální náklady větší velikost kódu.
__forceinline Klíčové slovo přepíše analýza nákladů a přínosů a závisí na rozhodnutí programátor místo.Používat opatrně __forceinline.Nerozlišující používání __forceinline může mít za následek větší kód s pouze okrajový výkonu zisky, nebo v některých případech i ztráty výkonu (kvůli zvýšené stránkovacího větší spustitelného souboru, například).
Použití vložených funkcí provést program rychleji, protože odstraňují zatížení spojené s volání funkce.Funkce rozbalené včleněné podléhají optimalizace kódu na normální funkce není k dispozici.
Kompilátor zpracovává možnosti rozšíření inline a klíčová slova jako návrhy.Není zaručeno, že funkce bude inlined.Nelze vynutit kompilátoru vložené určitou funkci, dokonce i s __forceinline klíčové slovo.Při kompilaci s /clr, kompilátor nebude vložené funkci Pokud jsou použita funkce atributy zabezpečení.
Vložené klíčové slovo je k dispozici pouze v jazyce C++.__inline a __forceinline klíčová slova jsou k dispozici v c a C++.Pro kompatibilitu s předchozími verzemi _inline je synonymum pro __inline.
Vložené klíčové slovo kompilátoru sděluje upřednostňována vložená rozšíření.Kompilátor však vytvořit samostatnou instanci funkce (konkretizaci) a vytvořit standardní volání klipem namísto vložení vložený kód.Dva případy, kdy k tomu může dojít, jsou:
Rekurzivní funkce.
Funkce, které uvedené prostřednictvím ukazatele jinde v jednotce překlad.
Tyto důvody mohou ovlivňovat inlining, jako ostatní mohou, podle uvážení kompilátor; by neměl záviset na vložené specifikátor způsobit funkce se inlined.
Stejně jako u běžných funkcí je pořadí hodnocení argumentů pro vložené funkce.Ve skutečnosti může být odlišné od objednávky vyhodnocovány argumenty při předání pomocí protokolu volání normální funkce.
/Ob volba kompilátoru optimalizace vám pomůže určit, zda skutečně dojde k rozšíření vložené funkce.
/ LTCG provádí cross modul inlining bez ohledu na to, zda bylo požadováno ve zdrojovém kódu.
Příklad 1
// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
if( a > b )
return a;
return b;
}
Funkce členů třídy lze deklarovat prostřednictvím vloženého vložené klíčové slovo nebo umístěním definice funkce v rámci definice třídy.
Příklad 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;
};
Konkrétní společnosti Microsoft
__inline Klíčové slovo je ekvivalentní vložené.
I s __forceinline, kompilátor nemůže kód vložený za všech okolností.Kompilátor nelze vloženou funkci, pokud:
Funkce nebo volajícího je kompilována s /Ob0 (vytvoří výchozí možnost ladění).
Funkce a volající použít různé typy (C++ zpracování výjimek v jedné, strukturované zpracování výjimek v druhé) zpracování výjimek.
Funkce má Proměnný seznam argumentů.
Pokud není kompilována s /Og, /Ox, /O1 nebo /O2, využívá funkce vložené sestavení.
Funkce je rekurzivní a nejsou doprovázena inline_recursion(on) # pragma.Pragma jsou inlined do hloubky 16 volání výchozí rekurzivní funkce.Chcete-li zmenšit hloubka inlining inline_depth pragma.
Funkce je virtuální a nazývá se prakticky.Přímé volání funkcí virtuální může být inlined.
Program zkopíruje adresu funkce a při volání prostřednictvím ukazatele na funkci.Přímé volání funkcí, které měly adresu může být inlined.
Funkce také označena holé__declspec modifikátor.
Pokud je kompilátor nemůže vložené funkce deklarovaná s __forceinline, generuje upozornění úrovně 1.
Rekurzivní funkce může být substituované vložené do hloubky určený inline_depth pragma nejvýše 16 volání.Po této hloubky rekurzivního volání funkcí jsou považovány volání instance funkce.Hloubka, do které rekurzivní funkce prozkoumán heuristiky vložené nesmí překročit 16.Inline_recursion pragma řídí vložené rozšiřující funkce aktuálně pod rozšíření.Najdete Vložené funkce rozšiřující (/ PS) volba kompilátoru související informace.
Konec konkrétní společnosti Microsoft
Další informace o použití vložené specifikátor, viz: