C++
Inline-Funktionen
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.