嗯,标准无法保证inline
函数实际内联;必须使用宏才能获得100%的保证。无论inline
关键字如何,编译器总是根据自己的规则决定哪些函数内联或不内联。
那么inline
关键字在使用现代编译器(例如最近的GCC版本)时会对编译器实际产生什么影响呢?
答案 0 :(得分:4)
它具有语义效果。为简化起见,可以在一个程序中多次定义标记为inline
的函数 - 尽管所有定义必须彼此相同 - 因此在标题中包含函数定义时,需要inline
的正确性(反过来,它使定义可见,因此编译器可以在没有LTO的情况下内联它。
除此之外,对于内联优化,"从不"是一个非常安全的近似值。它可能在一些编译器中有一些影响,但没有什么值得失眠,特别是没有实际的硬数据。例如,在以下代码中,using Clang 3.0 or 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);
}
}
答案 1 :(得分:1)
如果要控制内联,请坚持使用编译器提供的任何编译指示或属性来控制该行为。例如GCC上的__attribute__((always_inline))
和类似的编译器。正如您所提到的,inline
关键字通常会被忽略,具体取决于优化设置等。