标准并不保证inline
函数被实际内联,必须使用宏才能得到100%的保证。编译器总是根据自己的规则决定哪些函数是否内联,而不考虑inline
关键字。
那么,当使用现代编译器(如最近版本的GCC)时,inline
关键字什么时候会对编译器产生实际效果呢?
标准并不保证inline
函数被实际内联,必须使用宏才能得到100%的保证。编译器总是根据自己的规则决定哪些函数是否内联,而不考虑inline
关键字。
那么,当使用现代编译器(如最近版本的GCC)时,inline
关键字什么时候会对编译器产生实际效果呢?
inline
的函数可以在一个程序中定义多次 - 尽管所有定义必须相互等效 - 因此,在将函数定义包含在头文件中时需要存在inline
以确保正确性(这反过来使得定义可见,以便编译器可以在没有LTO的情况下将其内联)。inline
,main
都包含相同的代码。唯一的区别是work
是否作为独立函数保留供其他翻译单元链接,或者被删除。void work(double *a, double *b) {
if (*b > *a) *a = *b;
}
void maxArray(double* x, double* y) {
for (int i = 0; i < 65536; i++) {
//if (y[i] > x[i]) x[i] = y[i];
work(x+i, y+i);
}
}
inline
并不免除你遵守“一个定义规则”。仍然必须有一个外部定义,并且如果它与内联定义不匹配,则结果是未定义的。 - R.. GitHub STOP HELPING ICEinline
的语义与C的不匹配。即使在每个翻译单元中都有内联定义,C仍然需要一个外部定义,并且允许具有不同主体的内联定义(并且未指明调用哪个)。 - user743382static inline ...
,只要这个头文件在函数被使用的地方都被引用,就不会产生任何链接错误。 - Jonathan Lefflerstatic
,inline
在语义上就相当于没有作用,因此非静态情况才是有趣的。另一方面,我认为通常你需要static
。外部inline
的语义太混乱了,特别是在某些GCC配置文件中默认使用的不兼容GNU语义的情况下。:( - R.. GitHub STOP HELPING ICE__attribute__((always_inline))
。正如您所提到的,inline
关键字通常会根据优化设置等被忽略。
inline
没有static
或extern
有用吗?,并且你也可以查看extern inline
。请注意,尽可能使非内联函数成为static
是值得的;如果有意义,编译器可能会将它们优化为内联代码,但只有在它知道该函数不会从当前源文件外部调用时才能这样做,这意味着该函数必须是static
。 - Jonathan Lefflerstatic
函数,只是必须为外部调用者保留一个副本(增加代码大小)。不知道这是否会影响内联启发式算法。然而,有其他很好的理由使助手函数成为static
(减少全局命名空间的污染,从而能够使用更短、更好的名称)。 - user395760