GCC -flto 和 inline 关键字

GCC -flto and inline keyword

我的问题很简单,关键字inline对link时间优化的看法有影响吗?对于 link 时间优化,我指的是支持 -flto(Link 时间优化) 的 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);
}

b.c 中的内联关键字会在 linker 执行 LTO(Link 时间优化)时产生影响吗?

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

[...] Making a function an inline function suggests that calls to the function be as fast as possible. The extent to which such suggestions are effective is implementation-defined. [121]

[121] For example, an implementation might never perform inline substitution, or might only perform inline substitutions to calls in the scope of an inline declaration.

C标准没有提到LTO,所以在这方面没什么好说的。


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

特别是对于 GCC,有关于 -flto option and on LTO internals 的文档。然而,问题是 GCC 目前没有在其用户手册中提供很多细节。因此,您不能依赖它来保持稳定,即使您可以阅读当前的实现并了解启发式方法。

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

相关:Link-time optimization and inline