什么时候“内联”关键字在C中有效?

时间:2014-12-14 00:40:41

标签: c inline-functions

嗯,标准无法保证inline函数实际内联;必须使用宏才能获得100%的保证。无论inline关键字如何,编译器总是根据自己的规则决定哪些函数内联或不内联。

那么inline关键字在使用现代编译器(例如最近的GCC版本)时会对编译器实际产生什么影响呢?

2 个答案:

答案 0 :(得分:4)

它具有语义效果。为简化起见,可以在一个程序中多次定义标记为inline的函数 - 尽管所有定义必须彼此相同 - 因此在标题中包含函数定义时,需要inline的正确性(反过来,它使定义可见,因此编译器可以在没有LTO的情况下内联它。

除此之外,对于内联优化,"从不"是一个非常安全的近似值。它可能在一些编译器中有一些影响,但没有什么值得失眠,特别是没有实际的硬数据。例如,在以下代码中,using Clang 3.0 or GCC 4.7main包含相同的代码,无论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关键字通常会被忽略,具体取决于优化设置等。