好吧,标准并不能保证inline
函数实际上是内联的。必须使用宏才能获得 100% 的保证。编译器总是根据自己的规则来决定哪个函数是内联的还是不内联的,而不管inline
关键字是什么。
那么在inline
使用现代编译器(例如最新版本的 GCC)时,关键字何时会对编译器的工作产生实际影响?
好吧,标准并不能保证inline
函数实际上是内联的。必须使用宏才能获得 100% 的保证。编译器总是根据自己的规则来决定哪个函数是内联的还是不内联的,而不管inline
关键字是什么。
那么在inline
使用现代编译器(例如最新版本的 GCC)时,关键字何时会对编译器的工作产生实际影响?
它具有语义效果。为简化起见,标记的函数inline
可以在一个程序中定义多次——尽管所有定义必须彼此等价——因此inline
当在头文件中包含函数定义时,为了正确性需要存在因此编译器可以在没有 LTO 的情况下内联它)。
除此之外,对于内联优化,“从不”是一个非常安全的近似值。它可能对某些编译器有一些影响,但没有什么值得失眠的,尤其是在没有实际硬数据的情况下。例如,在以下代码中,使用 Clang 3.0 或 GCC 4.7,无论是否标记,都main
包含相同的代码。唯一的区别是是作为独立功能保留给其他翻译单元链接,还是被删除。work
inline
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);
}
}
如果您想控制内联,请坚持使用编译器提供的任何编译指示或属性来控制该行为。例如__attribute__((always_inline))
在 GCC 和类似的编译器上。正如您所提到的,inline
根据优化设置等,关键字通常会被忽略。