内联 vs __inline vs __inline__ vs __forceinline?

Posted

技术标签:

【中文标题】内联 vs __inline vs __inline__ vs __forceinline?【英文标题】:inline vs __inline vs __inline__ vs __forceinline? 【发布时间】:2011-02-15 10:45:44 【问题描述】:

这四个内联(关键字)词有什么区别?

inline__inline__inline____forceinline

【问题讨论】:

你也应该问问社区对内联的使用建议是什么。 【参考方案1】:

inline 是 C++ 和 C99 中的 关键字。

__inline 是 C 中内联函数的供应商特定关键字(例如 MSVC),因为 C89 没有它。

__inline__ 类似于__inline,但来自另一组编译器。

__forceinline 是另一个特定于供应商(主要是 MSVC)的关键字,与 __inline 提示相比,它对内联函数的作用更大(例如内联,即使它会导致更糟糕的代码)。

在 GCC 和 clang 中也有 __attribute__((always_inline))

【讨论】:

__forceinline 是一个比 inline 更有力的提示,但仍然只是一个提示 (msdn.microsoft.com/en-us/library/z8y1yy88%28VS.80%29.aspx)。 也许考虑将“Microsoft 特定”语言更改为“供应商特定”或类似的语言。我使用的许多嵌入式交叉开发工具集也支持 __inline 和 __forceinline。世界比 MSOFT 大 ;-) 所有 __forceinline 所做的只是跳过对内联的开销和收益因素的分析,并“强制”它发生。除非您真的需要内联,否则最好在使用 C++ 时坚持使用内联,或者在使用 C 时坚持使用 __inline。据我所知,__forceinline 源自 MSVC,但它在其他地方被使用和定义,特别是由 GCC(如如上所述)在属性表达式中。但是,当然,您必须使用内联标题或标志才能使用它。一些 IDE 默认禁用此功能,其他 IDE 默认启用。如果你是一个跨开发者,我会避开! gcc 建议将 __inline__ 作为 C99 之前的 inline 的替代品【参考方案2】:

__inline__inline____forceinline 都是特定于实现的。由于双下划线,它们都是为实现保留的标识符,因此不应与应用程序中使用的标识符冲突。

inline 是唯一的 C++ 关键字。

【讨论】:

【参考方案3】:

对于 Visual Studio 编译器,这意味着:

inline - 建议编译器内联您的代码

__forceinline - 覆盖内置编译器优化并生成内联代码

更多详情见:http://msdn.microsoft.com/en-us/library/z8y1yy88%28VS.71%29.aspx

【讨论】:

以上是关于内联 vs __inline vs __inline__ vs __forceinline?的主要内容,如果未能解决你的问题,请参考以下文章

函数内联 inline,__inline,__forceinline

调用 always_inline '_mm256_add_epi32' 时内联失败:目标特定选项不匹配 [重复]

c++: inline_函数与内联函数(超详细)

gcc悄无声色将静态函数内联了

调用 always_inline '__m128i _mm_cvtepu8_epi32(__m128i)' 时内联失败:目标特定选项不匹配 _mm_cvtepu8_epi32 (__m128i __X

内联函数