Suche…


Einführung

Eine mit dem inline Bezeichner definierte Funktion ist eine Inline-Funktion. Eine Inline-Funktion kann mehrfach definiert werden, ohne die One-Definition-Regel zu verletzen, und kann daher in einem Header mit externer Verknüpfung definiert werden. Das Deklarieren einer Funktion inline weist den Compiler an, dass die Funktion während der Codegenerierung eingebettet werden soll, bietet jedoch keine Garantie.

Syntax

  • inline function_declaration
  • inline Funktionsdefinition
  • Klasse {Funktionsdefinition};

Bemerkungen

Wenn der für eine Funktion generierte Code ausreichend klein ist, ist er in der Regel ein guter Kandidat, um eingebettet zu werden. Warum so Wenn eine Funktion groß ist und in einer Schleife eingebettet ist, wird bei allen durchgeführten Aufrufen der Code der großen Funktion dupliziert, was zu der generierten binären Größenschwellung führt. Aber wie klein reicht aus?

Inline-Funktionen scheinen zwar eine gute Möglichkeit zu sein, um Funktionsaufrufe zu vermeiden, es ist jedoch zu beachten, dass nicht alle Funktionen, die inline markiert sind, inline sind. Mit anderen Worten, wenn Sie inline sagen, ist dies nur ein Hinweis an den Compiler, keine Anweisung: Der Compiler ist nicht verpflichtet, die Funktion zu integrieren, es ist frei, sie zu ignorieren - die meisten tun dies. Moderne Compiler sind besser in der Lage, solche Optimierungen vorzunehmen, dass dieses Stichwort nun ein Überbleibsel der Vergangenheit ist, als dieser Funktionsvorschlag des Programmierers von den Compilern ernst genommen wurde. Sogar Funktionen, die nicht inline markiert sind, werden vom Compiler eingebettet, wenn er dies für vorteilhaft hält.

Inline als Verknüpfungsrichtlinie

Der praktischere Einsatz von inline im modernen C ++ beruht auf der Verwendung als inline Direktive. Wenn Sie eine Funktion in einem Header definieren , jedoch nicht deklarieren, die in mehreren Quellen enthalten sein wird, hat jede Übersetzungseinheit eine eigene Kopie dieser Funktion, die zu einer ODR- Verletzung (One Definition Rule) führt. Diese Regel besagt grob, dass es nur eine Definition einer Funktion, Variablen usw. geben kann. Um diese Verletzung zu umgehen, wird die Funktionsverknüpfung implizit durch inline Markieren der Funktionsdefinition intern gemacht.

FAQs

Wann sollte ich das Schlüsselwort 'Inline' für eine Funktion / Methode in C ++ schreiben?

Nur wenn die Funktion in einem Header definiert werden soll. Genauer nur, wenn die Definition der Funktion in mehreren Übersetzungseinheiten angezeigt werden kann. Es ist eine gute Idee, kleine Funktionen (wie in einem Liner) in der Header-Datei zu definieren, da der Compiler damit mehr Informationen erhält, mit denen er bei der Optimierung des Codes arbeiten kann. Es erhöht auch die Kompilierungszeit.

Wann sollte ich nicht das Schlüsselwort 'Inline' für eine Funktion / Methode in C ++ schreiben?

Fügen Sie keine inline wenn Sie der Meinung sind, dass Ihr Code schneller ausgeführt wird, wenn der Compiler ihn inline einfügt.

Wann weiß der Compiler nicht, wann eine Funktion / Methode inline erstellt werden soll?

Im Allgemeinen kann der Compiler dies besser als Sie tun. Der Compiler hat jedoch keine Option zum Inline-Code, wenn er keine Funktionsdefinition hat. In maximal optimiertem Code werden normalerweise alle privaten Methoden eingebettet, ob Sie danach fragen oder nicht.

Siehe auch

Nicht-Mitglied-Inline-Funktionsdeklaration

inline int add(int x, int y);

Inline-Funktionsdefinition für Nichtmitglieder

inline int add(int x, int y)
{
    return x + y;
}

Member-Inline-Funktionen

// header (.hpp)    
struct A
{
    void i_am_inlined()
    {
    }
};

struct B
{
    void i_am_NOT_inlined();
};

// source (.cpp)    
void B::i_am_NOT_inlined()
{
}

Was ist Funktion Inlining?

inline int add(int x, int y)
{
    return x + y;
}

int main()
{
    int a = 1, b = 2;
    int c = add(a, b);
}

In dem obigen Code, wenn add inlined wird, würde der resultierende Code so etwas wie dieses werden

int main()
{
    int a = 1, b = 2;
    int c = a + b;
}

Die Inline-Funktion ist nirgends zu sehen, ihr Körper wird in den Körper des Anrufers eingebettet . Wenn add nicht eingebettet worden wäre, würde eine Funktion aufgerufen werden. Der Aufwand für das Aufrufen einer Funktion, z. B. das Erstellen eines neuen Stack-Frames , das Kopieren von Argumenten, das Vornehmen lokaler Variablen, das Springen (Verlust der Referenzlokalität und dort durch Cache-Misses) usw., ist erforderlich.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow