?
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 inline weg, wird sich mit hoher Wahrscheinlichkeit Dein Linker beschweren, dass die Funktion foo mehrfach 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.