Frage

Ich verstehe Sie das Inline-Schlüsselwort verwenden können, oder einfach nur eine Methode in einer Klassendeklaration ala kurzen Ctor oder eine Getter-Methode setzen, aber nicht der Compiler, um die endgültige Entscheidung über, wenn meine Methoden Inline?

Zum Beispiel:

inline void Foo::vLongBar()
{
   //several function calls and lines of code
}

Wird der Compiler meiner Inline-Deklaration ignorieren, wenn es denkt, wird es meinen Code ineffizient machen?

Als Neben Problem, wenn ich eine Getter-Methode außerhalb meiner Klasse deklariert haben wie folgt aus:

void Foo::bar() { std::cout << "baz"; }

Wird die Compiler inline diese unter der Decke?

War es hilfreich?

Lösung

Ob ein fiunction inlined ist, am Ende des Tages, ganz bis zu der Compiler. Typischerweise Je komplexer eine Funktion in Bezug auf die Strömung ist, desto weniger wahrscheinlich ist es der Compiler Inline. und einige Funktionen, wie rekursiven, können einfach nicht inlined werden.

Der Hauptgrund für keine Funktion inlining ist, dass es erheblich die Gesamtgröße des Codes erhöhen würde, zu verhindern iot von in der Cache des Prozessors gehalten wird. Dies wäre in der Tat ein pessimisation, anstatt eine Optimierung.

In Bezug auf den Programmierer zu lassen entscheiden sich in den Fuß zu schießen, oder anderswo, können Sie die Funktion Inline selbst. - schreiben Sie den Code, der in der Funktion gegangen wäre, was der Anruf-Website Funktion gewesen wäre

Andere Tipps

Ja, die endgültige Entscheidung, ob Ihr Code Inline liegt in der C ++ Compiler. Das Inline-Schlüsselwort ist ein Vorschlag, keine Anforderung.

Hier sind einige Details, wie diese Entscheidung in der Microsoft C ++ Compiler verarbeitet wird

Wie viele haben bereits gebucht, ist die endgültige Entscheidung immer bis zu den Compiler, auch wenn Sie feste Hinweise wie forceinline geben kann.
Ein Teil der Grund dafür ist, dass inlining ist kein automatischer „schneller gehen“ -Schalter. Zu viel inlining kann Ihr Code viel größer machen und mit anderen Optimierungen stören können. Siehe Die C ++ FAQ Lite über Inline-Funktionen und Leistung .

Wie andere haben darauf hingewiesen, das inline Schlüsselwort ist lediglich ein Vorschlag an den Compiler den Code inline. Da der Compiler wird routinemäßig Inline-Code, der nicht mit inline markiert hat, und nicht die Inline-Code, der das Schlüsselwort hat, scheint ebenso überflüssig wie register oder (pre-C ++ 0x) auto.

Allerdings gibt es eine andere Sache, dass die inline Schlüsselwort Effekte: Es ändert sich die Verknüpfung der Funktion von externe (Standardeinstellung für Funktionen) Inline . Inline-Verknüpfung kann jede Übersetzungseinheit enthält eine eigene Kopie des Objektcodes ist, und hat den Linker redundante Kopien von den letzten ausführbaren entfernen. Wenn das bei Ihnen den Vorlagen erinnert, ja, Vorlagen auch Inline-Verknüpfung verwenden.

Ja, hat der Compiler die endgültige Entscheidung. In VS kann man sogar Inline-rekursive Funktionen in bestimmten Tiefe ;)

#pragma inline_depth( [0... 255] )

Nur meinen 5 Cent hinzuzufügen ...

Ich fand dieses Guru der Woche Artikel über inlining sehr nützlich.

Soweit ich erinnere mich, ich irgendwo gelesen, dass sogar ein Linker inlining tun könnte, wenn es die Objektdateien verknüpft und stellt fest, dass der Code verknüpft werden können inlined werden.

Grüße, Ovanes

  

Als Neben Problem, wenn ich eine Getter-Methode außerhalb meiner Klasse deklariert haben wie folgt aus:

void Foo::bar() { std::cout << "baz"; }
  

Wird die Compiler inline diese unter der Decke?

Es hängt davon ab. Es kann für alle Anrufer in derselben Übersetzungseinheit (die .cpp Datei und alle seine #include Definitionen). Aber es hat immer noch eine nicht-inlined Version zu kompilieren, da Anrufer dieser Funktion außerhalb der Übersetzungseinheit sein kann. Sie können bei der Arbeit sehen dies möglicherweise (wenn Ihr Compiler kann es tatsächlich tun) bei hohen Optimierungsstufen. (Insbesondere:.. Vergleichen, was passiert, wenn Sie alle Ihre CPP-Dateien in einer CPP im Vergleich zu dem typischen Layout # include Bei allen Definitionen in einer Übersetzungseinheit die Chancen für ein solche inlining drastisch erhöhen)

Wie pro meines Wissens-Compiler automatisch machen eine Funktion, die Sie inline deklariert (oder innerhalb einer Klassendeklaration geschrieben) nicht -inline wenn es eine Schleife wie für findet, während usw. Dies ist ein Beispiel, in den Compiler das letzte Wort in der Inline-Funktionen.

Wenn Sie wirklich, positiv, absolut, ohne dass nicht den Code inline, gibt es immer das Makro ist. C hat diese seit Jahren unterstützt, und weil sie nur das Ersetzen von Text vor der Zusammenstellung sind sie wirklich, wirklich, Inline, was Sie schreiben.

Das ist, warum die ‚inline‘ Schlüsselwort (und sogar in einigen Fällen die Zwangs Varianten) kann es sich leisten, nicht eine standardisierte Möglichkeit haben es zu zwingen - man kann immer nur ein Makro schreiben

.

Das heißt, die Inline-Schlüsselwort ist oft besser, weil der Compiler oft weiß, ob machen eine Funktion inline Sinn macht oder nicht, und weil die inline mit dem Rest der Compiler-Optimierungen in Wechselwirkung treten können.

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