inline und __forceinline
-
Hi. Mich würde mal interessieren wo genau der Unterschied zwischen inline und den Compilerspezifischen Inline Typ __forceinline liegt. Ist es so, dass wenn man inline nutzt, der Compiler selbst entscheidet, ob er es nun selbst inline macht, und wenn man __forceinline nutzt, den Compiler dazu zwingt den Code inline zu machen? Oder erfüllt __forceinline noch einen anderen Zweck?
-
Potatoman schrieb:
Ist es so, dass wenn man inline nutzt, der Compiler selbst entscheidet, ob er es nun selbst inline macht,
Ja. Das ist für den Compiler nur ein Hinweis "du könntest mal schauen ob das inline nicht besser ist" - da ein aktueller Compiler aber eh immer schaut ist das explizite inline sinnfrei, mit einer Ausnahme: freie Fuktionen, die in Headern definiert werden und nicht in einem anonymen Namespace liegen, müssen als inline
deklariert werden, da der Compiler sich sonst an "multiple definitions" stört, wenn man den header an mehr als einer Stelle einbindet.und wenn man __forceinline nutzt, den Compiler dazu zwingt den Code inline zu machen? Oder erfüllt __forceinline noch einen anderen Zweck?
Ich kenne __forceinline nicht, aber da es übersetze etwa "erzwinge inline" heißt dürfte es genau das tun. Einen anderen Zweck würde ich dahinter nicht vermuten, das wäre unintuitiv und würde vermutlich ein schlechtes Feature draus machen. Ich würde es an deiner Stelle aber nicht benutzen, es sei denn, du weißt haargenau was der Compiler dann anders macht, inklusive aller Nebenwirkungen (Optimierungen usw.) - dazu slltest du allerdings dir zumindest da wo du es benutzen willst drüber klar sein, welche verschiedenen Assembler-Codes daurch erzeugt werden, welcher davon der schnellere ist und vieles mehr.
Ich vermute mal schon weil du die Frage gestellt hast dass du kein Fachmann in dem Gebiet des vom Compiler erzeugten Assemblercodes und von Optimierungen bist und sage deshalb mal pauschal: Finger weg von __forceinline, und kümmer dich nicht um inline - mit der einen oben genannten Ausnahme.
-
Potatoman schrieb:
Ist es so, dass wenn man [...] __forceinline nutzt, den Compiler dazu zwingt den Code inline zu machen?
Was hindert dich daran, in der Referenz über den Compiler nachzuschauen?
<a href= schrieb:
MSDN: inline, __inline, __forceinline">There is no guarantee that functions will be inlined. You cannot force the compiler to inline a particular function, even with the __forceinline keyword.
Vermutlich betrifft das hauptsächlich rekursive Funktionen. Sofern möglich wird sich dein Compiler die Funktion sicher inlinen.