我的问题很简单,关键字内联是否会对链接时间优化的视图产生影响?链接时间优化是指支持-flto(链接时间优化)的GCC版本。
例如:
的main.c
#include "b.h"
int main() {
print_x(2);
return 0;
}
b.h
extern void print_x(int x);
b.c
#include "b.h"
#include "stdio.h"
inline void print_x(int x) {
printf("%d\n", x);
}
当链接器执行LTO(链接时间优化)时, b.c 中的inline关键字会有所不同吗?
答案 0 :(得分:1)
原则上,编译器可以使用inline
关键字的存在来改变其启发式。但是,inline
说明符的存在改变其启发式的程度是一个实现细节;甚至到了忽略它的地步(6.7.4.5):
[...]使函数成为内联函数表明对函数的调用尽可能快。这些建议有效的程度是实施定义的。 [121]
[121]例如,实现可能永远不会执行内联替换,或者可能只对内联声明范围内的调用执行内联替换。
C标准没有提及LTO,因此在这方面没有更多的话要说。
现在,当然,编译器可以使用不同的启发式方法,并根据它是否在LTO模式下编译来区别对待inline
关键字。检查手册和/或编译器的实现是回答该问题所必需的,并且可能因版本而异。
特别是对于GCC,有-flto
option和LTO internals上的文档。然而,问题是GCC目前没有提供有关其用户手册的许多细节。因此,即使您可以阅读当前的实现并了解启发式是什么,也不能依赖它是稳定的。
无论如何,鉴于编译器的内联决策有多么不同(供应商,版本,选项等),尝试调整代码并没有多大意义。如果您确实需要更改内联决策,则应使用编译器提供的特定提示,而不是尝试调整其算法的结果。例如,对于GCC,请尝试使用__attribute__((always_inline))
。