c - GCC -flto 和内联关键字



我的问题很简单,关键字内联对链接时间优化的视图有影响吗?对于链接时间优化,我的意思是支持 -flto(链接时间优化)的 GCC 版本。

例如:

主.c

#include "b.h"
int main() {
print_x(2);
return 0;
}

B.H

extern void print_x(int x);

不列颠哥伦比亚省

#include "b.h"
#include "stdio.h"
inline void print_x(int x) {
printf("%dn", x);
}

当链接器执行LTO(链接时间优化)时,b.c中的内联关键字会有所不同吗?

原则上,编译器可以使用inline关键字的存在来更改其启发式方法。但是,inline说明符的存在在多大程度上改变了其启发式方法是一个实现细节;甚至到了忽略它的地步(6.7.4.5):

[...]使函数成为内联函数意味着对该函数的调用尽可能快。这些建议在多大程度上有效,由执行决定。[注121]

[121] 例如,实现可能永远不会执行内联替换,或者可能只对内联声明范围内的调用执行内联替换。

C 标准没有提到 LTO,因此在这方面没有更多要说的。


当然,现在编译器可以有不同的启发式方法,并根据它是否在 LTO 模式下编译而以不同的方式处理inline关键字。 需要检查编译器的手册和/或实现才能回答该问题,并且可能因版本而异。

特别是对于 GCC,有关于-flto选项和 LTO 内部的文档。然而,问题是GCC目前没有在其用户手册上提供许多细节。因此,您不能依赖它是稳定的,即使您可以阅读当前的实现并查看启发式方法是什么。

无论如何,考虑到编译器的内联决策(供应商、版本、选项等)的变化有多大,尝试围绕它调整代码没有多大意义。如果确实需要更改内联决策,则应使用编译器提供的特定提示,而不是尝试调整其算法的结果。例如,对于 GCC,请尝试使用__attribute__((always_inline))

相关:链接时间优化和内联

最新更新