Was sind die Vor- und Nachteile der Verwendung von Inline-Funktionen in C ++? Ich sehe, dass es nur die Leistung für den Code erhöht, den der Compiler ausgibt, aber mit den heute optimierten Compilern, schnellen CPUs, großem Speicher usw. (nicht wie im Jahr 1980 <wo Speicher knapp war und alles in 100 KB Speicher passen musste), was Vorteile haben sie heute wirklich?
c++
inline-functions
Lennie De Villiers
quelle
quelle
inline
es sich um ein C ++ - Schlüsselwort handelt und dass Inlining eine Compileroptimierungstechnik ist. Die richtige Antwort finden Sie in dieser Frage " Wann soll ich das Schlüsselwortinline
für eine Funktion / Methode schreiben? ".Antworten:
Inline-Funktionen sind schneller, da Sie keine Dinge wie Parameter und die Rücksprungadresse auf den Stapel schieben und von diesem entfernen müssen. Dadurch wird Ihre Binärdatei jedoch etwas größer.
Macht es einen signifikanten Unterschied? Auf moderner Hardware für die meisten nicht merklich genug. Aber es kann einen Unterschied machen, was für manche Menschen ausreicht.
Wenn Sie etwas inline markieren, können Sie nicht garantieren, dass es inline ist. Es ist nur ein Vorschlag an den Compiler. Manchmal ist dies nicht möglich, z. B. wenn Sie eine virtuelle Funktion haben oder wenn es sich um eine Rekursion handelt. Und manchmal entscheidet sich der Compiler einfach dafür, es nicht zu verwenden.
Ich konnte sehen, dass eine solche Situation einen erkennbaren Unterschied machte:
quelle
Vorteile
Nachteile
Inlining Magic
return 42 ;
Anweisung reduziert werden . Das ist für mich extremes Inlining . Es kommt im wirklichen Leben selten vor, es verlängert die Kompilierungszeit, bläht Ihren Code nicht auf und beschleunigt Ihren Code. Aber wie der Gral, versuchen Sie nicht, ihn überall anzuwenden, da die meisten Verarbeitungen nicht auf diese Weise aufgelöst werden können ... Trotzdem ist das sowieso cool ...:-p
quelle
3.2/6: There can be more than one definition of [..] inline function with external linkage [..] non-static function template
. Bei 5.1.5 / 6For a generic lambda, the closure type has a public inline function call operator member template
. Und7.1.2/2: the use of inline keyword is to declare an inline function
wo es ein Vorschlag ist, den Funktionskörper am Point of Call einzubinden. DaherIn archaischem C und C ++
inline
ist wie folgtregister
: ein Vorschlag (nichts weiter als ein Vorschlag) an den Compiler über eine mögliche Optimierung.inline
Weist den Linker in modernem C ++ an, dass mehrere Definitionen (keine Deklarationen) in verschiedenen Übersetzungseinheiten gleich sind und der Linker eine frei behalten und alle anderen verwerfen kann.inline
ist obligatorisch, wenn eine Funktion (egal wie komplex oder "linear") in einer Header-Datei definiert ist, damit mehrere Quellen sie einschließen können, ohne dass der Linker einen Fehler "Mehrfachdefinition" erhält.Innerhalb einer Klasse definierte Elementfunktionen sind standardmäßig "inline", ebenso wie Vorlagenfunktionen (im Gegensatz zu globalen Funktionen).
Beachten Sie die Aufnahme von fileA.h in zwei CPP-Dateien, was zu zwei Instanzen von führt
afunc()
. Der Linker verwirft einen von ihnen. Wenn neininline
angegeben ist, beschwert sich der Linker.quelle
Inlining ist ein Vorschlag an den Compiler, den er ignorieren kann. Es ist ideal für kleine Codebits.
Wenn Ihre Funktion inline ist, wird sie im Grunde genommen in den Code eingefügt, in dem der Funktionsaufruf ausgeführt wird, anstatt tatsächlich eine separate Funktion aufzurufen. Dies kann die Geschwindigkeit verbessern, da Sie den eigentlichen Anruf nicht tätigen müssen.
Es unterstützt auch CPUs beim Pipelining, da sie die Pipeline nicht mit neuen Anweisungen neu laden müssen, die durch einen Aufruf verursacht werden.
Der einzige Nachteil ist eine mögliche Vergrößerung der Binärdatei, aber solange die Funktionen klein sind, spielt dies keine große Rolle.
Ich überlasse diese Art von Entscheidungen heutzutage eher den Compilern (na ja, die klugen sowieso). Die Leute, die sie geschrieben haben, neigen dazu, die zugrunde liegenden Architekturen weitaus detaillierter zu kennen.
quelle
Die Inline-Funktion ist die von den Compilern verwendete Optimierungstechnik. Man kann dem Funktionsprototyp einfach ein Inline-Schlüsselwort voranstellen, um eine Funktion inline zu machen. Die Inline-Funktion weist den Compiler an, den gesamten Funktionskörper einzufügen, wo immer diese Funktion im Code verwendet wurde.
Vorteile: -
Es erfordert keinen Funktionsaufruf-Overhead.
Es spart auch Overhead von Variablen Push / Pop auf dem Stapel während des Funktionsaufrufs.
Es spart auch Overhead des Rückrufs von einer Funktion.
Es erhöht die Referenzlokalität durch Verwendung des Befehls-Cache.
Nach dem In-Lining kann der Compiler bei Bedarf auch eine prozedurale Optimierung anwenden. Dies ist die wichtigste, auf diese Weise kann sich der Compiler jetzt auf die Eliminierung von totem Code konzentrieren, die Verzweigungsvorhersage, die Eliminierung von Induktionsvariablen usw. stärker belasten.
Um mehr darüber zu erfahren, folgen Sie diesem Link http://tajendrasengar.blogspot.com/2010/03/what-is-inline-function-in-cc.html
quelle
Ich möchte hinzufügen, dass Inline-Funktionen beim Erstellen einer gemeinsam genutzten Bibliothek von entscheidender Bedeutung sind. Ohne Inline-Markierungsfunktion wird es in binärer Form in die Bibliothek exportiert. Es wird auch in der Symboltabelle angezeigt, wenn es exportiert wird. Auf der anderen Seite werden Inline-Funktionen weder in die Bibliotheksbinärdateien noch in die Symboltabelle exportiert.
Dies kann kritisch sein, wenn die Bibliothek zur Laufzeit geladen werden soll. Es kann auch binär kompatible Bibliotheken treffen. Verwenden Sie in solchen Fällen nicht Inline.
quelle
inline
beim Erstellen einer gemeinsam genutzten Bibliothek nicht einfach ignorieren !Während der Optimierung werden viele Compiler Funktionen inline, auch wenn Sie sie nicht markiert haben. Sie müssen Funktionen im Allgemeinen nur dann als Inline markieren, wenn Sie etwas wissen, was der Compiler nicht weiß, da er normalerweise selbst die richtige Entscheidung treffen kann.
quelle
inline
Mit dieser Option können Sie eine Funktionsdefinition in eine Header-Datei und#include
diese Header-Datei in mehrere Quelldateien einfügen, ohne die eine Definitionsregel zu verletzen.quelle
Im Allgemeinen ist es heutzutage eine Zeitverschwendung, wenn sich ein moderner Compiler Gedanken über das Inlining macht. Der Compiler sollte all diese Überlegungen für Sie optimieren, indem er den Code selbst analysiert und die an den Compiler übergebenen Optimierungsflags angibt. Wenn Sie Wert auf Geschwindigkeit legen, weisen Sie den Compiler an, die Geschwindigkeit zu optimieren. Wenn Sie sich für Speicherplatz interessieren, weisen Sie den Compiler an, den Speicherplatz zu optimieren. Wie eine andere Antwort angedeutet hat, wird ein anständiger Compiler sogar automatisch inline, wenn es wirklich Sinn macht.
Wie bereits erwähnt, garantiert die Verwendung von Inline keine Inline-Funktion. Wenn Sie dies garantieren möchten, müssen Sie ein Makro anstelle einer Inline-Funktion definieren, um dies zu tun.
Wann muss ein Makro inline und / oder definiert werden, um die Aufnahme zu erzwingen? - Nur wenn Sie eine nachgewiesene und notwendige nachgewiesene Geschwindigkeitssteigerung für einen kritischen Codeabschnitt haben, von dem bekannt ist, dass er sich auf die Gesamtleistung der Anwendung auswirkt.
quelle
Es geht nicht nur um Leistung. Sowohl C ++ als auch C werden für die eingebettete Programmierung verwendet und befinden sich auf der Hardware. Wenn Sie beispielsweise einen Interrupt-Handler schreiben möchten, müssen Sie sicherstellen, dass der Code sofort ausgeführt werden kann, ohne dass zusätzliche Register und / oder Speicherseiten ausgetauscht werden. Dann ist Inline praktisch. Gute Compiler machen selbst ein "Inlining", wenn Geschwindigkeit benötigt wird, aber "Inline" zwingt sie.
quelle
Fiel in die gleichen Schwierigkeiten mit Inlining-Funktionen in so Bibliotheken. Es scheint, dass Inline-Funktionen nicht in die Bibliothek kompiliert werden. Infolgedessen gibt der Linker einen Fehler "undefinierte Referenz" aus, wenn eine ausführbare Datei die Inline-Funktion der Bibliothek verwenden möchte. (ist mir beim Kompilieren der Qt-Quelle mit gcc 4.5 passiert.
quelle
Warum nicht standardmäßig alle Funktionen inline schalten? Weil es ein technischer Kompromiss ist. Es gibt mindestens zwei Arten der "Optimierung": Beschleunigung des Programms und Reduzierung der Größe (Speicherbedarf) des Programms. Inlining beschleunigt im Allgemeinen die Dinge. Der Overhead des Funktionsaufrufs entfällt, wodurch vermieden wird, dass Parameter vom Stapel gedrückt und dann abgerufen werden. Dies vergrößert jedoch auch den Speicherbedarf des Programms, da jetzt jeder Funktionsaufruf durch den vollständigen Code der Funktion ersetzt werden muss. Um die Sache noch komplizierter zu machen, denken Sie daran, dass die CPU häufig verwendete Speicherblöcke in einem Cache auf der CPU für einen ultraschnellen Zugriff speichert. Wenn Sie das Speicher-Image des Programms groß genug machen, kann Ihr Programm den Cache nicht effizient nutzen, und im schlimmsten Fall kann Inlining Ihr Programm tatsächlich verlangsamen.
quelle
Unser Informatikprofessor forderte uns auf, Inline niemals in einem C ++ - Programm zu verwenden. Auf die Frage nach dem Grund erklärte er uns freundlich, dass moderne Compiler erkennen sollten, wann Inline automatisch verwendet werden soll.
Ja, die Inline kann eine Optimierungstechnik sein, die nach Möglichkeit verwendet werden kann, aber anscheinend ist dies bereits für Sie erledigt, wenn es möglich ist, eine Funktion trotzdem zu inline.
quelle
inline
in C ++ hat zwei sehr unterschiedliche Bedeutungen - nur eine davon bezieht sich auf die Optimierung, und Ihr Professor hat diesbezüglich Recht. Die zweite Bedeutung voninline
ist jedoch häufig erforderlich, um die Ein-Definition-Regel zu erfüllen .Schlussfolgerung aus einer anderen Diskussion hier:
Gibt es Nachteile bei Inline-Funktionen?
Anscheinend ist an der Verwendung von Inline-Funktionen nichts auszusetzen.
Beachten Sie jedoch die folgenden Punkte!
Übermäßiger Gebrauch von Inlining kann Programme tatsächlich langsamer machen. Abhängig von der Größe einer Funktion kann durch Inlining die Codegröße erhöht oder verringert werden. Das Inlining einer sehr kleinen Accessor-Funktion verringert normalerweise die Codegröße, während das Inlining einer sehr großen Funktion die Codegröße dramatisch erhöhen kann. Auf modernen Prozessoren wird kleinerer Code aufgrund der besseren Verwendung des Anweisungscaches normalerweise schneller ausgeführt. - Google-Richtlinien
Die Geschwindigkeitsvorteile von Inline-Funktionen nehmen mit zunehmender Größe der Funktion tendenziell ab. Irgendwann wird der Overhead des Funktionsaufrufs im Vergleich zur Ausführung des Funktionskörpers gering, und der Nutzen geht verloren - Quelle
Es gibt wenige Situationen, in denen eine Inline-Funktion möglicherweise nicht funktioniert:
Das
__inline
Schlüsselwort bewirkt, dass eine Funktion nur dann eingefügt wird, wenn Sie die Optimierungsoption angeben. Wenn die Optimierung angegeben__inline
ist, hängt es von der Einstellung der Inline-Optimierungsoption ab , ob die Option berücksichtigt wird oder nicht . Standardmäßig ist die Inline-Option immer dann wirksam, wenn das Optimierungsprogramm ausgeführt wird. Wenn Sie Optimieren angeben, müssen Sie auch die Option noinline angeben, wenn das__inline
Schlüsselwort ignoriert werden soll. -Quellequelle
inline
Schlüsselwort ignoriert, um zu bestimmen, ob Inline- Code verwendet werden soll, sind alle oben genannten Punkte falsch. Sie wären wahr, wenn der Compiler das Schlüsselwort zum Inlining verwenden würde (es wird nur zum Bestimmen der Markierung mehrerer Definitionen für Verknüpfungszwecke verwendet).