c - "inline"关键字在C中什么时候生效?

标签 c inline-functions

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

那么 inline 关键字什么时候才能真正对编译器在使用现代编译器(例如最新版本的 GCC)时所做的事情产生影响?

最佳答案

它具有语义效果。为简化起见,标记为 inline 的函数可能会在一个程序中定义多次 - 尽管所有定义必须彼此等效 - 因此在包含时需要 inline 的存在以确保正确性 header 中的函数定义(这反过来使定义可见,因此编译器可以在没有 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);
    }
}

关于c - "inline"关键字在C中什么时候生效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27465181/

相关文章:

c - 在 Win32 的 ListView 中保持行永久选中

c - umask 不能在 C 代码中工作

c++ - 这段代码将如何编译

c++ - extern "C"内联函数

c++ - 为什么在 C++ 中使用内联函数不会增加二进制大小?

c - 使用 C 中的 Do..while 循环登录

c - STM32将无符号短数组转换为 float 组

c++ - 源.cpp :LINE:COL: error: function definition is not allowed here

sql-server - 为什么表值函数的性能比select直接语句好?

c - 内联函数如何公开内部数据结构?