GCC -flto和内联关键字

时间:2018-03-18 09:13:46

标签: c gcc link-time-optimization

我的问题很简单,关键字内联是否会对链接时间优化的视图产生影响?链接时间优化是指支持-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关键字会有所不同吗?

1 个答案:

答案 0 :(得分:1)

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

  

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

     

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

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

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

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

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

相关:Link-time optimization and inline