好吧,标准并不能保证inline
函数实际上是内联的。一个必须使用宏才能有100%的保证。不管inline
关键字如何,编译器始终根据自己的规则来决定内联或不内联哪个函数。
那么,什么时候inline
关键字实际上会对使用现代编译器(例如最新版本的GCC)时编译器的操作产生影响?
最佳答案
它具有语义效果。为简化起见,标记为inline
的函数可以在一个程序中定义多次(尽管所有定义必须彼此相等),因此,在将函数定义包含在 header 中时,为了正确起见,必须存在inline
(这反过来使可见的定义,因此编译器可以在不使用LTO的情况下内联它)。
除此之外,对于内联优化,“从不”是一个非常安全的近似值。它可能在某些编译器中具有一定的作用,但没有值得失去的 sleep ,尤其是没有实际的硬数据时。例如,在以下代码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);
}
}
关于c - "inline"关键字何时在C中有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27465181/