Freigeben über


inline, __inline, __forceinline

Die inline und Bezeichner __inline weist den Compiler an, eine Kopie des Funktionsrumpfs in jeder Stelle einfügen, den die Funktion aufgerufen wird.

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

Hinweise

Die Einfügung (Inline Erweiterung oder Inlining) tritt nur dann, wenn die Kosten des Compilers auf Show Analyse Verarbeiten von rentabel sein.Inline Erweiterung verringert den Funktionsaufruf mehraufwand an den potenziellen Kosten der größeren Codegröße.

Das __forceinline-Schlüsselwort überschreibt die Kosten und Vorteile beruht auf dem Urteil des Programmierers.Übungsvorsicht, wenn __forceinlineverwendet wird.Unterschiedslose Verwendung von __forceinline kann nur von Code mit größeren Gewinnen der eingeschränkten Leistung oder in einigen Fällen sogar verlusten Leistung führen (aufgrund des erweiterten Paging einer größeren ausführbaren Datei (z).

Verwenden von Inlinefunktionen kann das Programm schneller ausführen, da sie den Mehraufwand vermeiden, der mit Funktionsaufrufen zugeordnet ist.Erweiterte Funktionen inline sind sich je nach den Code-Optimierungen, die den normalen Funktionen nicht verfügbar sind.

Der Compiler behandelt die Optionen und Schlüsselwörter zur Inline-Erweiterung als Vorschläge.Es gibt keine Garantie dafür, dass Funktionen inline sind.Sie können den Compiler nicht an eine bestimmte Funktion selbst mit dem Schlüsselwort __forceinline inline erzwingen.Beim Kompilieren mit /clr, wird der Compiler nicht inline eine Funktion, wenn die Sicherheitsattribute gibt, die der Funktion angewendet werden.

Das inline-Schlüsselwort ist nur in C++ verfügbar.Die __inline und __forceinline Schlüsselwörter sind in C und C++ verfügbar.Aus Gründen der Kompatibilität mit früheren Versionen _inline ist ein Synonym für __inline.

Das inline-Schlüsselwort weist den Compiler an, dass inline Erweiterung bevorzugt wird.Jedoch kann der Compiler eine separate Instanz der Funktion instanziieren Sie erstellen () und aufrufende StandardBindungen erstellen, anstatt den Code inline einfügen.Zwei Fälle, in denen diese auftreten kann, sind:

  • Rekursive Funktionen.

  • Funktionen, die durch einen Zeiger an anderer Stelle in der Übersetzungseinheit verwiesen wird.

Diese Gründen beeinträchtigen möglicherweise das Inlining, wie andere kannnach Ermessen des Compilers verfügbar. Sie sollten nicht vom inline Spezifizierer abhängen, um eine Funktion inline führen.

Wie bei normalen Fähigkeiten, gibt es keine definierte Reihenfolge der Auswertung der Argumente an eine Inlinefunktion.Tatsächlich kann dies in der Reihenfolge unterscheiden, in der die Argumente ausgewertet werden, wenn sie mit dem normalen Funktionsaufruf protokolls übergeben werden.

Die Option ist hilfreich /Ob Compileroptimierungs um zu bestimmen, ob Inlinefunktions tatsächlich Erweiterung auftritt.

/LTCG modulübergreifendes Inlining führt unabhängig davon, ob sie im Quellcode angefordert wurde.

Beispiel 1

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

Die Memberfunktion einer Klasse können inline deklariert werden, indem das inline-Schlüsselwort oder die Funktionsdefinition in der Klassendefinition platziert.

Beispiel 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;
};

Microsoft-spezifisch

Das __inline-Schlüsselwort ist in inline.

Auch mit __forceinline, kann der Compiler nicht unter allen Umständen Inlinecode.Der Compiler kann nicht inline eine Funktion, wenn:

  • Die Funktion oder der Aufrufer mit /Ob0 kompiliert wurde (die Standardoption für Debugbuilds).

  • Die Funktion und der Aufrufer verwenden unterschiedliche Typen der Ausnahmebehandlung (die C++-Ausnahmebehandlung, die in einer strukturierten Ausnahmebehandlung in der anderen behandelt).

  • Die Funktion weist eine Variablenargumentliste.

  • Die Funktion wird mit Inlineassembly, es sei denn, kompiliert mit /Og, /Ox, /O1 oder /O2.

  • Die Funktion rekursiv ist und nicht von **#pragma inline_recursion ()**begleitet.Mit dem Pragma sind rekursive Funktionen mit einer standardmäßigen Tiefe von 16 Aufrufe inline.So reduzieren, um die Inlining tiefe inline_depth Pragma.

  • Die Funktion ist virtuell und virtuell aufgerufen.Direktrufe den virtuellen Funktionen können inline sein.

  • Das Programm hat die Adresse der Funktion und der Aufruf wird über den Zeiger auf die Funktion erfolgt.Direktrufe auf Funktionen, die ihre Adresse aufweisen, die entladen wird, können inline sein.

  • Die Funktion wird auch mit dem Modifizierer nackt __declspec markiert.

Wenn der Compiler nicht inline eine Funktion kann, die mit __forceinlinedeklariert ist, wird eine Warnung der Stufe 1.

Rekursive Funktionen können in einer Tiefe " inline " ersetzt werden, die vom inline_depth Pragma bis zu maximal 16 Aufrufe angegeben wird.Anschließend werden diese Tiefe, rekursive Funktion als Aufrufe einer Instanz der Funktion behandelt.Die Tiefe, auf die durch das rekursive Funktionen inline heuristische überprüft werden, kann 16 nicht überschreiten.Das inline_recursion Pragma steuert die gerade eine Funktion inline Erweiterung die Erweiterung.Zeigen Sie die Compileroption /Ob ( Inlinefunktions-Erweiterung ) für weitere Informationen.

Microsoft ENDES bestimmten

Weitere Informationen zur Verwendung des inline Bezeichner finden Sie unter:

Siehe auch

Referenz

C++-Schlüsselwörter

noinline

auto_inline