Inline Methode
-
Hallo,
sehe ich das richtig, dass wenn ich die Methoden in der Klasse Deklariere und Definiere sie dann als inline Interpretiert werden?
-
Das ist eine implizite Anfrage nach inline. Was der Compiler draus macht kannst du eh nicht entscheiden (außer, dein compiler hat besondere Features dafür)
-
Für den Linker spielt es allerdings eine Rolle. Wenn du eine Methode innerhalb der Klassendefinition definierst, läuft das aufs Gleiche hinaus wie eine Definition ausserhalb der Klasse, aber im gleichen Header und mit dem Schlüsselwort
inline.
-
Ja das meinte ich. Ist Inline in der Heutigen zeit überhaupt noch sinnvoll, also das explizit zu definieren? Oder macht das der Compiler so und so bei kurzen Methoden/Funktionen?
-
Noob12345 schrieb:
Ja das meinte ich. Ist Inline in der Heutigen zeit überhaupt noch sinnvoll, also das explizit zu definieren? Oder macht das der Compiler so und so bei kurzen Methoden/Funktionen?
Das steht in der Dokumentation deines Compilers. Die Compilern die ich benutze (gcc, intel), machen das automatisch auf den höheren Optimierungsstufen.
-
Noob12345 schrieb:
Ja das meinte ich. Ist Inline in der Heutigen zeit überhaupt noch sinnvoll, also das explizit zu definieren?
Sicher. Wie Nexus sagt, spielt es für den Linker eine besondere Rolle. Probiere mal das hier:
a.cpp
inline int foo() {return 0;} int main() { return foo(); }b.cpp
inline int foo() {return 0;}Beides kompilieren und Linken ---> kein Problem. Lässt Du das
inlineweg, wird sich mit hoher Wahrscheinlichkeit Dein Linker beschweren, dass die Funktionfoomehrfach definiert wurde.Inline erlaubt Dir also eine Mehrfachdefinition (immer noch höchstens eine Definition pro Übersetzungseinheit aber ein und dieselbe Def darf in mehreren ÜEs auftauchen). Funktionen, die in der Klasse definiert werden, sind implizit inline -- können daher auch "mehrfach definiert" werden. Und das passiert ja auch, wenn man so eine Klasse in eine Header-Datei schreibt und die in mehreren Übersetzungseinheiten einbindet.
Warum die ODR ("one definition rule") für Inline-Funktionen so eine Ausnahme macht, sollte auch klar sein. Ein Compiler, der die Funktion "inlinen" wollen würde, müsste sonst erstmal die Implementierung finden. Da ist es einfacher, die Implementierung der Inline-Funktion in jeder Übersetzungseinheit einzubauen, in der die Funktion genutzt wird.
Wenn normale Funktionen, die in anderen Übersetzungeinheiten definiert werden, "geinlined" werden sollen, dann ist das erstmal gar nicht so einfach. Eine Technik, die das erlaubt ist LTO, Link-Time-Optimization. Das bieten aber die wenigsten Tool-Chains an und erfordert zumindest beim GCC extra Arbeit (muss per Schalter aktiviert werden, wenn ich mich nicht irre. Die Objekt-Dateien werden dann auch größer, weil der "Zwischencode" da noch drin ist. Ich halte aber für diese Aussagen meine Hand nicht ins Feuer).
Fazit: Wenn "geinlined" werden soll, ist es am einfachsten dieselbe zu "inlinende" Funktion in mehreren ÜEs zu definieren. Damit es keinen Linker-Fehler gibt, muss das Schlüsselwort Inline verwendet werden oder die Funktion in einer Klasse implementiert werden. Das klappt dann auch wegen der Ausnahme für Inlinefunktionen in der ODR. Dies trifft übrigens auch für Definitionen von Funbktionstemplates zu.