xiv*_*r77 8 c inline-functions
那么,标准无法保证inline函数实际内联; 必须使用宏才能获得100%的保证.无论inline关键字如何,编译器总是根据自己的规则决定哪个函数内联或不内联.
那么,inline当使用现代编译器(如最新版本的GCC)时,关键字何时会对编译器的作用产生什么影响?
小智 5
它具有语义效果。为了简化起见,标记的函数inline可以在一个程序中定义多次 - 尽管所有定义必须彼此等效 - 因此,inline在标头中包含函数定义时,需要存在 才能保证正确性(这反过来又使定义可见)因此编译器可以在没有 LTO 的情况下内联它)。
除此之外,对于内联优化,“从不”是一个完全安全的近似值。它可能对某些编译器有一定的影响,但没有什么值得睡觉的,尤其是没有实际的硬数据。例如,在下面的代码中,使用 Clang 3.0 或 GCC 4.7,无论是否标记,main都包含相同的代码。唯一的区别是是否保留为独立功能以供其他翻译单元链接,还是被删除。workinlinework
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);
}
}
Run Code Online (Sandbox Code Playgroud)