6 Stimmen

Vor- und Nachteile von 'inline'

Zunächst möchte ich die Fakten nennen, die ich über "inline" weiß, damit Sie sich nicht die Mühe machen, sie erneut zu nennen.

  1. Eine Inline-Funktion ist eine besondere Art von Funktion, deren Definition in jeder Übersetzungseinheit, in der die Funktion verwendet wird, vorhanden sein muss.
  2. Es ist ein Hinweis an den Compiler (den er ignorieren kann), den Funktionsaufruf wegzulassen und stattdessen den Körper zu erweitern.
  3. Der einzige Vorteil, den ich kenne, ist, dass (2.) den Code schneller machen kann.
  4. Der einzige Nachteil, den ich kenne, ist, dass (1.) die Kopplung erhöht, was schlecht ist.

Betrachten wir nun die Vorlagen. Wenn ich eine Vorlagenbibliothek habe, muss ich die Definitionen der Funktionsvorlagen in jeder Übersetzungseinheit bereitstellen, richtig? Vergessen wir den umstrittenen "Export" für eine Weile, da er das Problem ohnehin nicht wirklich löst. Ich komme also zu dem Schluss, dass es keinen Grund gibt no um eine Vorlagenfunktion inline zu machen, weil der einzige Nachteil von Inline, den ich kenne, von vornherein da ist.

Bitte korrigieren Sie mich, wenn ich falsch liege. Vielen Dank im Voraus.

12voto

greyfade Punkte 24134

Der einzige Vorteil, den ich kenne, ist, dass (2.) den Code schneller machen kann.

Mai ist das entscheidende Wort. Untergeordnete Funktionen かもしれません bestimmte Codepfade schneller machen, ja.

Aber eine Inline-Funktion belastet den Befehlscache der meisten modernen CPUs zusätzlich. Wenn Ihre Funktion zu groß ist, um in den L1-Befehlscache zu passen, wird sie かもしれません tatsächlich laufen Langsamer als die Durchführung eines Funktionsaufrufs (für den die CPU die Funktion und ihre Rückgabeseite im Voraus abrufen kann).

Das Inlining einer Funktion kann auch den L2-Cache übermäßig belasten - wenn eine Inline-Funktion ungewöhnlich oft verwendet wird, erhöht die zusätzliche Codegröße die Wahrscheinlichkeit von Cache-Fehlern, was zu langen Verzögerungen und Pipeline-Staus führt, da die CPU Däumchen dreht und darauf wartet, dass der Speicherbus etwas tut.

inline ist weit davon entfernt, ein Allheilmittel zu sein. Compiler mit aggressiver Optimierung ignorieren die inline Hinweis vollständig zu ignorieren, da sie stattdessen die zu inlineenden Funktionen auf der Grundlage von Heuristiken wie der Codegröße oder dem Vorhandensein von Verzweigungen auswählen, unabhängig davon, ob die inline Stichwort.

Der einzige Nachteil, den ich kenne, ist, dass (1.) die Kopplung erhöht, was schlecht ist.

Das ist etwas, das ich noch nie gehört habe. "Kopplung" ist ein Begriff, den ich bisher nur gehört habe, wenn es um die Beschreibung der Beziehungen auf hoher Ebene des Codes geht. Es ist eher eine Frage der Wartbarkeit und Allgemeinheit des Codes. inline ist ein Problem der Low-Level-Code-Generierung.

Was Templates anbelangt, so wird auch hier ein aggressiv optimierender Compiler inline arbeiten, wenn seine Heuristiken einen Vorteil zeigen.

Es gibt jedoch ein Problem auf Link-Ebene zu berücksichtigen: Sie müssen möglicherweise eine Funktion oder eine Vorlage deklarieren inline (oder static (je nach Situation), um doppelte Symbole bei der Verknüpfung zu eliminieren oder die Sichtbarkeit von Symbolen einzuschränken. Dies ist natürlich keine Optimierung.

Zusammenfassend lässt sich sagen, dass Sie sich nicht die Mühe machen sollten, die inline Schlüsselwort, es sei denn, dies ist ausdrücklich erforderlich.

1voto

Alexandre C. Punkte 53706

Ich denke, Sie sollten sich nicht die Mühe machen, zu schreiben. inline oder nicht vor den Definitionen von Schablonenfunktionen. Ich denke, dass die meisten Compiler kleine Funktionen sowieso einbinden, ob Sie sie darum bitten oder nicht. Einige Compiler sind sogar in der Lage, dies zur Link-Zeit für Funktionen zu tun, die in nur einer Übersetzungseinheit definiert sind.

Imho ist das einzige Argument für die inline Schlüsselwort ist die Möglichkeit, Nicht-Template-Funktionen innerhalb von Headern zu definieren, für jene Compiler, die zur Link-Zeit nicht inline sind (oder wenn Sie eine "Nur-Header"-Bibliothek wollen).

1voto

justin Punkte 103032

Sie müssen nicht in jeder Übersetzung die Definition angeben - nur in den Unis, die sie verwenden ;)

es tut Es spielt keine Rolle, ob Sie sie inline deklarieren oder nicht. Der Compiler kann Ihre Verwendung des Schlüsselworts (oder anderer Force-Inline-Deklarationen) anerkennen. Der Compiler kann exportierte Klassen/Funktionen aus Ihren Vorlagendefinitionen generieren. Wenn mich jemand fragen würde, ob ich standardmäßig inline sein soll oder nicht (da er die Auswirkungen der Verwendung nicht kennt), würde ich sagen: "Verwenden Sie es nicht", weil der Compiler ein besseres Verständnis für Ihr Programm hat.

Beispiel:

  • Nehmen wir an, der Compiler fügt auf Ihren Wunsch hin einige Funktionen ein
  • Die Inlining-Erweiterung während der Optimierung endet in der Regel bei einer bestimmten Anzahl von Befehlen... ups - der Compiler hat einfach das Zeug weggeschmissen, das er sollte aus der Zeile herausgerückt, weil der Textkörper mit diesen Vorlagen, die standardmäßig inline sind, zu groß war.
  • sonst kann es passieren, dass Sie eine extragroße Binärdatei bekommen

so dass Sie eine Hand hinter dem Rücken des Compilers binden, wenn Sie standardmäßig inline (vorausgesetzt, natürlich erkennt er Ihre Verwendung des Schlüsselworts).

Generell gilt: Wenn du es nicht weißt, vertraue dem Compiler (Schreiber).

Es gibt einige Fälle, in denen ich standardmäßig Inline deklariere (und sei es nur, um exportierte Symbole zu reduzieren).

andere Vorteile des Inlinings:

  • Inlining kann Code/Funktionen kleiner machen
  • Inlining kann die Anzahl der exportierten Symbole reduzieren
  • kann der Compiler auch bessere Optimierungen vornehmen, da er während der Optimierung mehr vom Programm "sehen" kann.

0voto

Alexander Rafferty Punkte 6030

Da es sich um ein Inline-Programm handelt, entfällt der Overhead für das Erstellen und Zerstören eines neuen Stack-Frames und das Springen zu einer anderen Stelle in der Exe. Dadurch wird der Code nur geringfügig schneller.

Der Nachteil ist natürlich, dass die Größe der Exe zunimmt, da die Funktion an jedem Ort, an dem sie aufgerufen wird, implementiert werden muss.

EDIT

Das Inlining von Funktionen lohnt sich nur, wenn sie oft aufgerufen werden und die Funktionsgröße klein ist. Andernfalls kann die Zunahme der Dateigröße das Programm tatsächlich langsamer machen, und es lohnt sich wirklich nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X