好吧,标准并不能保证inline函数实际上是内联的。一个必须使用宏才能有100%的保证。不管inline关键字如何,编译器始终根据自己的规则来决定内联或不内联哪个函数。

那么,什么时候inline关键字实际上会对使用现代编译器(例如最新版本的GCC)时编译器的操作产生影响?

最佳答案

它具有语义效果。为简化起见,标记为inline的函数可以在一个程序中定义多次(尽管所有定义必须彼此相等),因此,在将函数定义包含在 header 中时,为了正确起见,必须存在inline(这反过来使可见的定义,因此编译器可以在不使用LTO的情况下内联它)。

除此之外,对于内联优化,“从不”是一个非常安全的近似值。它可能在某些编译器中具有一定的作用,但没有值得失去的 sleep ,尤其是没有实际的硬数据时。例如,在以下代码using Clang 3.0 or GCC 4.7中,无论main是否标记为workinline都包含相同的代码。唯一的区别是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/

10-13 08:25