2

我的问题很简单,关键字 inline 对链接时间优化的观点有影响吗?链接时间优化是指支持 -flto(链接时间优化)的 GCC 版本。

例如:

主程序

#include "b.h"

int main() {
    print_x(2);
    return 0;
}

bh

extern void print_x(int x);

公元前

#include "b.h"
#include "stdio.h"

inline void print_x(int x) {
    printf("%d\n", x);
}

当链接器进行 LTO(链接时间优化)时, bc中的 inline 关键字会有所不同吗?

4

1 回答 1

1

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

[...] 使函数成为内联函数表明对函数的调用尽可能快。此类建议的有效程度由实施定义。[121]

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

C 标准没有提到 LTO,所以在这方面没有太多可说的。


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

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

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

相关:链接时优化和内联

于 2018-03-27T14:30:35.250 回答