vc内联参数 /Ob2: The default value. Allows expansion of functions marked as inline, __inline, or __forceinline, and any other function that the compiler chooses.

vc基本上只把inline当作一个建议,实际编译时会自动确定一个函数时不时需要内联,即使没有指定inline关键字,或者函数非内联并且定义在cpp中,只要需要都会自动内联。当然这个会受到优化参数的影响,但是大部分情况下都会开优化的吧。另外似乎gcc也会有类似的优化?是不是现在编译器都支持这种优化了?

那么,是不是除非有特殊需求,根本不用去考虑inline这个关键字,然后交给编译器处理就好了?类似C语言时代的auto关键字一样?

不考虑inline还可以避免指定内联函数时函数体必须定义在头文件中的问题,头文件中的依赖就会比较少,并且看起来也比较清晰,反正编译器也会根据需要自动内联的。


V8 中定义了一个 V8_INLINE,定义在 include/v8config.h 下:

#if !defined(DEBUG) V8_HAS_ATTRIBUTE_ALWAYS_INLINE
# define V8_INLINE inline __attribute__((always_inline))
#elif !defined(DEBUG) V8_HAS___FORCEINLINE
# define V8_INLINE __forceinline
#else
# define V8_INLINE inline
#endif

而 V8_HAS_ATTRIBUTE_ALWAYS_INLINE 的定义是:

#if defined(__clang__)
// ...
# define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline))
// ...
#elif defined(__GNUC__)
// ...
# define V8_HAS_ATTRIBUTE_DEPRECATED (V8_GNUC_PREREQ(3, 4, 0))
// ...
#endif

V8_HAS___FORCEINLINE 定义为:

#if defined(_MSC_VER)
// ...
# define V8_HAS___FORCEINLINE 1
#endif

抄吧。


我记得如果函数实现在头文件里,而又不写inline,链接时会有多重定义错误。
我当年把inline 和 const 当做两大装逼关键字,但是后来写著写著就忘了有这么个关键字了。

虽然题主是基于MSCXX的角度在两年前提出的问题,而我压根没用过VC/VS,但是还是想强答一波。

inline 的含义是「容许多次定义」而不是「优先内联」。

C++标准中 inline 和内联没有必然的关系。如果硬要说,那就是用了内联替换(inline substitution)的单词、且在标准下编译器可以对内联定义的函数做内联替换的优化。

而 C99 的 inline 和 C++的很大区别,具体就不细说了。


inline 的引入目的主要是效率的考量,基于这一点,机器性能的提升应该会使得大家逐渐淡忘


推荐阅读:
相关文章