Frage

Wenn ich eine Nicht-Elementfunktion in einem Header definieren, wird es immer durch den Compiler inline sein, oder hat der Compiler auf seine Heuristik wählen basiert? Ich weiß, dass __inline nur ein Hinweis ist, ist es das gleiche mit Funktionen in Header?

War es hilfreich?

Lösung

Beachten Sie, dass aus einem Header etwas darunter ist nicht anders als nur direkt in der Quelldatei eingeben. So in einem Header zu sein macht keinen Unterschied, so weit wie der Compiler angeht; es nie wusste, es war da.

Wenn Sie also eine Funktion in einer Header-Datei definieren, und Sie schließen, dass die Header-Datei in einer Datei, dann ist es genau wie Sie die Funktion direkt in die Datei eingegeben hat. So, jetzt ist die Frage, „hat der Compiler Inline Dinge basierend auf Heuristik wählen?“

Die Antwort ist „es hängt von dem Compiler“. Der Standard übernimmt keine Garantie, was inlined bekommt oder nicht. Wie gesagt, wird jeder moderne Compiler sehr intelligent sein, was es inlines, wahrscheinlich mit Heuristiken.

Allerdings haben wir zu einem interessanten Punkt kommen. Stellen Sie sich vor Sie haben eine Funktion in einem Header und binden Sie den Header in mehrere Quelldateien. Sie werden dann mehrere Definitionen der Funktion, über Übersetzungseinheiten, und dies verstößt gegen die Ein-Definition-Regel. Ergo, werden Sie Kompilierungsfehler erhalten. (Der Linker Fehler ist in der Regel etwas entlang der Linien von: „Fehler, Funktion bereits in y definiert x“). Was Sie tun können, ist die inline Schlüsselwort verwenden und Sie nicht verletzen mehr die ODR

Übrigens __inline ist nicht-Standard. Im Gegensatz zu Ihrem Beitrag, es ist in der Regel eine Compiler-Erweiterung, die Kräfte inlining, deutet es nicht. inline ist das Standard-Schlüsselwort, das ursprünglich bei inlining zu Hinweis gedacht war. Wie Sie sagen, die meisten modernen Compiler es vollständig in dieser Hinsicht ignorieren und es ist nur Zweck heutzutage Dinge interne Bindung zu geben.

Andere Tipps

Von der C ++ FAQ Lite :

  

Egal, wie Sie eine Funktion bezeichnen   als inline, ist es eine Anforderung, dass die   Compiler ist zu ignorieren erlaubt: es   könnte Inline-expand einige, alle oder keine   die Anrufe an eine Inline-Funktion.

Es wird auf Heuristik wählen basiert. Stellen Sie sicher, dass Sie erklären es als Inline ausdrücklich anders können Sie ein Duplikat Symbol Link-Fehler erhalten, wenn Sie den Header in mehr als einer Übersetzungseinheit umfassen.

Wenn Sie definieren eine Funktion mit externer Bindung in einer Header-Datei und füge ihn in mehr als eine Übersetzungseinheit, werden Sie Kompilierungsfehler erhalten (genauer: Linker erorr) für die Verletzung von One Definition Regel (ODR). Definieren einer Funktion in einer Header-Datei wird nicht vom Compiler genommen werden als Hinweis auf inlining und nicht entschuldigen Sie von der Beachtung der Anforderungen der ODR: So ist die Antwort „nein“ ist. Nicht nur solche Funktionen sind nicht zu inlined garantiert, aber wahrscheinlich wird Ihr Programm nicht einmal kompilieren.

Um eine Funktion in einer Header-Datei zu definieren und damit haben Sie entweder weg, um ihm interne Bindung geben (erklärt es static, und mit separater Funktion in jeder Übersetzungseinheit am Ende) oder explizit deklariert es inline.

Wie für die Heuristik ... Moderne Compiler werden in der Regel praktisch jede Funktion prüfen für inlining (von Heuristiken anwenden), und zwar unabhängig davon, wo sie definiert ist und ob es explizit inline deklariert wird oder nicht.

Es gibt keine Magie über Funktionen in Header. Der Compiler weiß nicht einmal, ob eine Funktion in einem Header definiert ist oder nicht. (Da Header effektiv einfach kopieren / in die Quelldatei eingefügt, könnten Sie definieren es in einem Header, aber der Compiler sieht es einfach als Teil der Übersetzungseinheit)

Darüber hinaus gibt es zwei verschiedene Bedeutungen von „inline“ zu beachten:

kann eine Funktion sein inlined , wie durch den C definiert ++ Standard: Dies erfolgt entweder durch die Funktion mit dem inline Schlüsselwort Vorfixierung, oder wenn es eine Elementfunktion, indem es an Ort und Stelle zu definieren im Innern die Klassendefinition.

Der Effekt davon ist, auf

  • informiert die Linker, dass sie die Funktionsdefinition in mehreren Dateien auftreten können, und es sollte sich nur zusammen leise verschmelzen, anstatt einen Fehler zu werfen
  • macht es einfacher für die Compiler der inlining Optimierung auszuführen.

Die inlining Optimierung auf der anderen Seite, ist einfach der Akt des Ersetzens eines Funktionsaufruf durch den Körper der Funktion genannt, was bedeutet, dass diese Optimierung tatsächlich Aufrufstellen angewendet wird, nicht auf Funktionen . Eine Funktion kann normalerweise einige Orte genannt werden, aber an anderer Stelle inlined. Ein Funktionsaufruf ist inlined, wenn die Compiler wie es sich anfühlt, und es ist am besten, um es vom Konzept her von der ersten Bedeutung von „inline“ vollständig zu trennen.

Der Compiler gelten die inlining Optimierung ob, wann und wo es fühlt sich an wie sie. Es verwendet eine Menge von Heuristiken dafür. Kleinere Funktionen sind eher inlined werden. Wenn er feststellt, dass vor Ort eines bestimmten Anruf ausgeführt werden soll, wird ausreichend oft, ist es wahrscheinlicher, inlined werden. Schließlich wird die Heuristik es Anwendungen auf Basis von „wird es verbessern oder zu degradieren Leistung“. Und es ist in der Regel besser beurteilen dies als Menschen, so sollten Sie nicht wirklich brauchen, zu wissen, was genau Heuristik es verwendet. Inlining wird zu viel nur Leistung schaden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top