Muss inline noch explicit hingeschrieben werden?
-
Wenn ich jetzt eine Methode hab wie
int GetVal() {
return 42;
}Diese schreib ich in den Header und nicht in die cpp Datei, weil sonst das inlinen ja nicht funktioniert. Muss ich jetzt explicit 'inline' noch vor die Methode schreiben oder macht der Compiler die Funktion automatisch inline wenn er es für nötig hält? Was meint/wißt ihr?
-
Muss ich jetzt explicit 'inline' noch vor die Methode schreiben oder macht der Compiler die Funktion automatisch inline wenn er es für nötig hält? Was meint/wißt ihr?
Die Antwort ist zweigeteilt.
1. Ja du musst inline explizit hinschreiben. Ansonsten verletzt du spätestens, wenn zwei Dateien deine Header-Datei inkludieren die ODR.
2. Egal ob du das inline hinschreibst oder nicht. In beiden Fällen kann der Compiler die Funktion inline oder outline machen. inline ist *immer* nur eine Bitte an den Compiler. Welche Funktionen der Compiler letztlich inline expandiert entscheidet er allein.
-
Und was ist, wenn der Compiler es "outline" macht? Dann gibt's doch einen Linker-Fehler, weil die Funktion/Methode ja bei jedem #includen der Headerdatei neu definiert wird! Gibt's da irgendwelche Tricks, das zu vermeiden?
__forceinline?
-
Ich habe mir mal einige Open Source Projekte angeschaut, da hatten die manchmal alles in die Header geschrieben und garkeine cpp Datei. Und auch nirgendwo inline davor. Haben die dann gegen die ODR verstossen?
Der Compiler sagt da jedenfalls nichts.
Muss man wirkliche alle Methode und Funktionen die man im Header implementiert inlinen, da sonst gegen die Regel verstossen wird? Oder hab ich da was falsch verstanden?
-
Und was ist, wenn der Compiler es "outline" macht? Dann gibt's doch einen Linker-Fehler, weil die Funktion/Methode ja bei jedem #includen der Headerdatei neu definiert wird!
Nein. Die Semantik darf nicht verändert werden. Wie der Compiler das macht ist sein Problem.
__forceinline?
__forceinline ist eine MS-Erweiterung, die dafür sorgt, dass der Compiler die Funktion garantiert inlined. Sowas gibt's in Standard-C++ aber nicht.
Ich habe mir mal einige Open Source Projekte angeschaut, da hatten die manchmal alles in die Header geschrieben und garkeine cpp Datei. Und auch nirgendwo inline davor.
Kann es sein, dass das alles Templates waren?
Muss man wirkliche alle Methode und Funktionen die man im Header implementiert inlinen, da sonst gegen die Regel verstossen wird? Oder hab ich da was falsch verstanden?
Funktionen: Ja
Methoden: Wenn sie außerhalb der Klassendefinition definiert werden.
Template-Funktionen/Methoden: Nein.