【发布时间】:2020-06-03 01:24:24
【问题描述】:
我的 C++17 应用程序中有一个热关键路径函数(根据 perf record 约为 cycles:ppp 的 45%),它没有像我预期的那样被内联。这是一个很小的函数——它只是返回一个原子指针成员的值。反汇编确认该函数只是四个汇编指令,包括retq。此外,在整个构建中只有一个调用此函数的调用者。我什至将这个函数声明为__attribute__((always_inline))。然而,有一个调用并返回这个函数。
调用者在文件A中,被调用者在文件B中。
一些补充说明:
- 我正在使用
-O3和-march=native进行编译 - 被调用者声明为
const,并且不访问任何静态成员 - 链接时我正在通过
-flto进行链接类型优化 - 我使用的是icc(ICC)19.0.3.199编译
- 这些函数是简单的成员函数,它们是
const而不是模板,都包含十几个或更少的 x86 汇编指令
实际上,我已经简化了一点——实际上我的应用程序中有两个地方缺少内联。文件 B 有一个函数 F1,它调用文件 A 的 F2,它调用文件 B 的 F3(F2 和 F3 是上面列出的)。
文件 A:
F2() {
F3();
}
文件 B:
F1() {
F2();
}
F3() {}
如何将所有这些内联到一个函数中?另一个更基本的问题:是否可以内联在不同文件中定义的函数(可能使用 LTO)?
【问题讨论】:
-
你简化得太多了。标题中的内容 源中的内容。
-
所有函数定义都在源码中;标头只有声明
-
虽然编译器可以进行交叉翻译单元优化,但这更难,需要您正确设置编译器。要让内联在最简单的情况下工作,请将内联函数定义放入头文件中。如果函数很简单,这应该不会导致任何问题(您需要将它们标记为
inline才能成为合法的 C++) -
您是否正在使用
-fPIC构建?因为由于可能的函数插入,ICC 似乎从不内联非内联函数。并且 ICC 不支持-fno-semantic-interposition。 -
@StaceyGirl 实际上我正在与
-fPIC一起构建