Wann funktioniert inline bei einer Funktion nicht?
-
Der Compiler entscheidet i.d.R. selbständig, ob eine Funktion direkt als inline übersetzt wird oder nicht.
In den Projekteinstellungen kann man das Verhalten aber anpassen, sodass er bspw. nur mit inline gekennzeichnete Funktionen so behandelt, dies ist aber nicht zu empfehlen.
Per __forceinline kann man Microsoft Compiler dazu bewegen, auch Funktionen zu inlinen, bei denen er das von sich aus nicht machen würde.
-
danke für die schnellen Antworten. Ich sehe also gar nicht bewusst, wenn der Compiler sich dazu entscheiden würde, etwas doch nicht inline zu verwenden. Gut zu wissen

-
geht das nicht auch mit
__inline void foo();?
-
edit: Ach, es geht ausdrücklich um den MS-Compiler. Dann war die Aufforderung sich an den Standard zu halten die hier stand nicht nötig.
-
SeppJ schrieb:
edit: Ach, es geht ausdrücklich um den MS-Compiler.
Xcode verwendet soweit ich weiss GCC als Compiler.Dann war die Aufforderung sich an den Standard zu halten die hier stand nicht nötig.

-
Vicious Falcon schrieb:
Per __forceinline kann man Microsoft Compiler dazu bewegen, auch Funktionen zu inlinen, bei denen er das von sich aus nicht machen würde.
Selbst mit __forceinline kann MSVC nicht alles inlinen, und IIRC bekommt man auch trotz __forceinline keine Warning wenn er es nicht kann. __forceinline deaktiviert quasi nur den Check ob es "schlau" wäre eine Funktion zu inlinen. Die diversen KO-Kriterien bleiben natürlich aktiv, denn was nicht geht geht halt nicht.
-
Klar, es gibt einige Einschränkungen im Gebrauch von __forceinline. Wenn der Compiler dies nicht durchführt, generiert er eine Warnung ( Level 1 , 4714).
Die Einschränkungen sind aber überschaubar:
- Debugversion
- rekursive Funktion
- variable Argumentenliste
- inline asm
- virtuelle Funktion
- einige Spezialfälle
Die "cost/benefit analysis" wird in anderen Fällen komplett übergangen. Es macht natürlich keinen Sinn, eine mehrere Tausend Zeilen umfassende Funktion inlinen zu wollen.
-
Wann funktioniert inline bei einer Funktion nicht?
Letztendlich entscheidet der Compiler was er inline setzt.
Der Compiler entscheidet i.d.R. selbständig, ob eine Funktion direkt als inline übersetzt wird oder nicht
Ich finde diese Formulierungen alle sehr unglücklich gewählt. Inline funktioniert immer bei einer Funktion. Das heißt aber nicht, dass die Funktion immer "geinlined" werden kann. Sie ist trotzdem eine "inline-Funktion" bezüglich der "One Definition Rule". Der Compiler darf das Schlüsselwort auch nicht einfach ignorieren. Er darf aber das eigentliche "Inlining" (also das Einfügen von Progammcode einer Funktion in eine andere Funktion) sein lassen. Trotzdem verändert das Schlüsselwort inline (bzw das Definieren von Funktionen innerhalb von Klassendefinitionen) garantiert die Semantik des Programms. Wie unterscheiden bei der "One Definition Rule" zwischen "normalen" Funktionen und "Inline-Funktionen". Ob da eine Funktion wirklich "geinlined" wird, ist da eigentlich unwichtig. Trotzdem hat eine Funktion diese Eigenschaft. Sie ist entweder eine inline-Funktion oder nicht -- abhängig davon, wie sie deklariert wird bzw wo sie definiert wird. Ich hoffe es ist klar, wie das gemeint ist.
-
und nicht vergessen.
schreibst du die methoden defintion gleich bei der klassen deklaration hin ist die methode implizit inline.
-
Vicious Falcon schrieb:
Klar, es gibt einige Einschränkungen im Gebrauch von __forceinline. Wenn der Compiler dies nicht durchführt, generiert er eine Warnung ( Level 1 , 4714).
OK, sorry, das hatte ich falsch in Erinnerung.
Die Einschränkungen sind aber überschaubar:
- Debugversion
- rekursive Funktion
- variable Argumentenliste
- inline asm
- virtuelle Funktion
- einige SpezialfälleROFL

-
Stimmt, wenn ich das jetzt so lese "Hand -> Stirn -> Patch*" :p
-
Ich glaube nicht, daß inline asm das Inlinen verhindert.
-
Ich hatte blöderweise nur den ersten Teil geschrieben
The function uses inline assembly and is not compiled with /Og, /Ox, /O1, or /O2).