Inline vs __inline vs __inline__ vs __forceinline?

73

Was sind die Unterschiede zwischen diesen vier Inline- (Schlüssel-) Wörtern?

inline, __inline, __inline__, __forceinline.

Xavier Ho
quelle
Sie sollten auch die Community nach den Empfehlungen für die Verwendung von Inline fragen.
Martin York

Antworten:

86

inlineist das Schlüsselwort in C ++ und C99.

__inlineist ein herstellerspezifisches Schlüsselwort (z. B. MSVC ) für die Inline-Funktion in C, da C89 es nicht hat.

__inline__ist ähnlich, stammt __inlineaber von einem anderen Satz von Compilern.

__forceinlineist ein anderes herstellerspezifisches (hauptsächlich MSVC) Schlüsselwort, das mehr Kraft zum Inline-Funktionieren der Funktion als zum __inlineHinweis verwendet (z. B. Inline, selbst wenn dies zu schlechterem Code führt).

Es gibt auch __attribute__((always_inline))in GCC und klirren.

kennytm
quelle
12
__forceinline ist ein stärkerer Hinweis als inline, aber immer noch nur ein Hinweis ( msdn.microsoft.com/en-us/library/z8y1yy88%28VS.80%29.aspx ).
Joris Timmermans
Vielleicht sollten Sie die "Microsoft-spezifische" Sprache in "herstellerspezifisch" oder ähnliches ändern. Viele der eingebetteten entwicklungsübergreifenden Toolsets, die ich verwende, unterstützen auch __inline und __forceinline. Die Welt ist größer als MSOFT ;-)
Dan
Alles, was __forceinline tut, ist, die Analyse der Overhead- und Nutzenfaktoren von Inlining zu überspringen und es trotzdem zu "erzwingen". Wenn Sie nicht wirklich inline sein müssen, sollten Sie bei C ++ einfach bei Inline bleiben oder bei C bei __inline. Soweit ich weiß, stammt __forceinline von MSVC, wird aber an anderen Stellen verwendet und definiert, insbesondere von GCC (as oben angegeben) im Attributausdruck. Aber natürlich müssen Sie die Inline-Header oder Flags verwenden, damit sie verwendet werden können. Einige IDEs deaktivieren dies standardmäßig, andere aktivieren es standardmäßig. Ich würde klar steuern, wenn Sie ein Cross-Entwickler sind!
Osirisgothra
20

__inline, __inline__Und __forceinlinesind alle Implementierung spezifisch. Aufgrund des doppelten Unterstrichs sind alle Bezeichner für die Implementierung reserviert und sollten daher nicht mit den in Anwendungen verwendeten Bezeichnern in Konflikt stehen.

inline ist das einzige C ++ - Schlüsselwort.

CB Bailey
quelle