Sdílet prostřednictvím


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:

Viz také

Referenční dokumentace

Klíčových slov jazyka C++

noinline

auto_inline