c++ Inline-Funktion?

Lesezeit: 4 Minuten

c Inline Funktion
Pwnna

Warum sollte ich so etwas tun:

inline double square (double x) { return x*x;}

anstatt

double square (double x) { return x*x;}

Ist da ein Unterschied?

  • mögliches Duplikat von Inline-Funktionen vs. Präprozessor-Makros

    – Steve Jessop

    12. Mai 11 um 0:16 Uhr

  • Tatsächlich gibt es viele Dupes und Beinahe-Dupes: stackoverflow.com/search?q=c%2B%2B+inline. Einige der Antworten sind besser als andere, einige geben fälschlicherweise an, dass die inline Schlüsselwort bewirkt, dass die Funktion auf allen Aufrufseiten eingebunden wird, und so weiter. Das ist vielleicht nicht der engste Betrüger.

    – Steve Jessop

    12. Mai 11 um 0:18 Uhr


  • Siehe auch Inline-Funktionen in der C++-FAQ. Sie haben eine sehr gute Behandlung von Inline.

    – jww

    23. Juli 19 um 3:57 Uhr

Ersteres (mit inline) können Sie diese Funktion in eine Header-Datei einfügen, wo sie in mehrere Quelldateien eingefügt werden kann. Verwenden inline macht die Kennung ein Dateibereich, ähnlich wie es zu erklären static. Ohne zu benutzen inline, würden Sie vom Linker einen Fehler bei der Definition mehrerer Symbole erhalten.

Natürlich zusätzlich zu dem Hinweis an den Compiler, dass die Funktion kompiliert werden soll im Einklang wo es verwendet wird (Vermeidung eines Funktionsaufruf-Overheads). Der Compiler muss nicht auf die reagieren inline Hinweis.

  • Ich dachte, der Zweck von Inline besteht darin, dass der Compiler den Inhalt der Funktion, in der er aufgerufen wird, “erweitert”, sodass keine Vtable-Suche (oder ein Befehlssprung zur Funktion auf CPU-Ebene) erfolgt.

    – Dj.

    11. Mai 11 um 23:41 Uhr

  • Ist Ihr erster Punkt a [useful] Nebenwirkung der Zweckbestimmung?

    – Ian Fleeton

    11. Mai ’11 um 23:50 Uhr

  • @Ian Fleeton: Es ist tatsächlich ein Nebeneffekt; Wenn ein Inline-Bezeichner keinen Dateibereich hätte, wäre es unmöglich, eine Inline-Funktionsdefinition überhaupt in eine Header-Datei einzufügen.

    – Greg Hewgill

    11. Mai 11 um 23:52 Uhr

  • @Greg: Es verhält sich nicht wirklich so, wie es war static. Wenn dies der Fall wäre, hätte jede Übersetzungseinheit ihr eigenes Eigentum an ihrer Kopie der Funktion, und der Linker würde sie alle als unterschiedliche Funktionen behandeln (die zufällig denselben Namen haben). Im Gegenteil, inline weist den Linker an, dass, sollte er unterschiedliche Definitionen dieser Funktion sehen, diese alle gleich sind und zu einer zusammengeführt werden müssen. Aber wenn man dieses Detail ignoriert, verhält es sich größtenteils so, als ob es so wäre static.

    – GManNickG

    11. Mai 11 um 23:54 Uhr


  • @ DJ: inline kann die vtable-Suche nicht verhindern, die Sie benötigen Devirtualisierung nennen dafür.

    – Ben Voigt

    11. Mai 11 um 23:54 Uhr

Auf einem modernen Compiler gibt es wahrscheinlich keinen großen Unterschied. Es kann ohne inline sein inline und es darf nicht inline sein mit das inline.

  • Macht Sinn, ich ging von Referenz und 10-jähriger Erfahrung aus.

    – Ian Fleeton

    11. Mai 11 um 23:42 Uhr

c Inline Funktion
Erik Nedwidek

Ja, es gibt einen Unterschied. https://isocpp.org/wiki/faq/inline-functions.

Wenn Sie angeben, dass eine Funktion inline ist, veranlassen Sie den Compiler, den Code der Methode dort einzufügen, wo immer er aufgerufen wird.

void myfunc() {
  square(2);
}

ist identisch mit

void myfunc() {
   2 * 2;
}

Das Aufrufen einer Funktion ist gut für die Codeklarheit, aber wenn diese Funktion aufgerufen wird, muss der lokale Zustand auf den Stack geschoben werden, ein neuer lokaler Zustand wird für die Methode eingerichtet, und wenn dies erledigt ist, muss der vorherige Zustand entfernt werden. Das ist viel Aufwand.

Wenn Sie jetzt Ihre Optimierungsstufe erhöhen, trifft der Compiler Entscheidungen wie das Entrollen von Schleifen oder das Einfügen von Funktionen. Dem Compiler steht es immer noch frei, die Inline-Anweisung zu ignorieren.

  • Ich denke, mit gcc können Sie das Kompilier-Flag verwenden -Winline um zu warnen, wenn eine Funktion nicht eingebunden wird. Und das könnte man kombinieren -Werror wenn Sie ein Massochist sind.

    – Patmanpato

    21. Februar 16 um 21:38 Uhr


  • “Dem Compiler steht es immer noch frei, die Inline-Anweisung zu ignorieren.” Tatsächlich tut das jeder moderne Compiler.

    – Val ist immer noch bei Monica

    15. Juli 19 um 12:57 Uhr

Aus Wikipedia: Inline-Funktion ist eine Funktion, für die der Compiler aufgefordert wurde, eine Inline-Erweiterung durchzuführen. Mit anderen Worten, der Programmierer hat gefordert, dass der Compiler den vollständigen Körper der Funktion an jeder Stelle einfügt, an der die Funktion aufgerufen wird, anstatt Code zu generieren, um die Funktion an der einen Stelle aufzurufen, an der sie definiert ist. Compiler sind nicht verpflichtet, diese Aufforderung zu respektieren.

http://en.wikipedia.org/wiki/Inline_function

inline funktioniert gut mit dem Konzept von prozedurale Abstraktion:

inline double square (double x) { return x*x;}

int squareTwice(double x) {
    double first = square(x);
    double second = square(x);
    return first * second; 
}

Das obige ist im Grunde ähnlich wie das Folgende:

int squareTwice(double x) {
    double first = x*x;
    double second = x*x;
    return first * second; 
}

Dies liegt daran, dass, wenn der Compiler einen Funktionsaufruf inline erweitert, der Code der Funktion in den Codestream des Aufrufers eingefügt wird; Daher kann es einfacher sein, das zweite Beispiel prozedural vom ersten Beispiel zu abstrahieren.

Die prozedurale Abstraktion ermöglicht es, eine Routine in kleinere Subroutinen aufzuteilen, die viel einfacher zu lesen sind (obwohl dies eine Stilentscheidung sein kann).

1643937608 181 c Inline Funktion
Ian Fleeton

Wenn der Compiler dies befolgt, fügt die Inline-Funktion die Inline-Funktion in den Code ein, in dem sie aufgerufen wurde, als ob keine Funktion aufgerufen worden wäre (als ob Sie die Logik in die aufrufende Funktion eingefügt hätten) und den Overhead des Funktionsaufrufs vermeiden.

.

762650cookie-checkc++ Inline-Funktion?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy