在GCC,Clang和英特尔编译器中强制内联一个宏?

Tho*_*ser 8 c++ gcc clang icc c++11

我有一个函数,我需要在C++ 11的紧密循环中内联

我希望函数在头文件的单独文件中实现,并且仍然强制它在所使用的任何地方内联.另外,我想用clang,GCC和英特尔编译器进行编译.

充实要求.我正在寻找一个允许我做类似的宏:

#define force_inline <something here>
Run Code Online (Sandbox Code Playgroud)

在标题中:

force_inline void foo();
Run Code Online (Sandbox Code Playgroud)

我应该能够在实现文件中执行此操作:

void foo() {... Code.. }
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,我不想把代码放在我的标题中.我希望它们只包含函数的声明.

有没有办法使用适用于所有编译器的宏来实现内联?

我到目前为止最好的解决方案是这个宏:

#define forceinline inline __attribute__((always-inline))
Run Code Online (Sandbox Code Playgroud)

似乎ICC需要两者inline(与内联代码无关)和头部中的完整实现以保证函数的内联.

PS:是的,我已经测量了我的表现,而且我知道一个事实是内联函数比没有更快.不,编译器不会为我做这件事.

Col*_*rat 2

根据定义,内联函数的代码(由编译器)包含在调用它的每个位置。

这意味着编译器在构建调用者编译单元时需要能够访问函数的代码。这在技术上是可行的,但并不容易且难以扩展。请注意,如果您仅分发标头和库,则意味着使用您的组件的编译器必须从库中检索代码!

如果由编译器实现,则意味着您不会像常规函数那样从标头中包含代码中受益(更改 CPP 文件将需要根据标头重新编译所有文件,即使它没有更改) 。唯一的好处是拥有一个不包含代码的标头(这仍然是一件好事)。

我知道的当前唯一可用的解决方案是 GCC 的链接时间优化,因此不满足您使用 clang 和 icc 的要求:https://gcc.gnu.org/wiki/LinkTimeOptimization 也许存在类似的解决方案具有特定选项的编译器,这需要执行编译器相关代码来支持它。

解决方案 1: 您可以保留一个“干净的类”,而不在标头中进行任何实现,并将内联函数放在类的外部(但仍在标头内)。标头中仍然有定义,但它与声明明显分开,因此对可读性的影响较小。(这是我个人更喜欢的解决方案)

解决方案 2: 如果您确实只需要标头中的声明,则缓解问题的另一种方法是将代码分成 3 个文件而不是 2 个: - 仅包含接口的 .h 文件 - 包含内联函数的 .i 文件并包含在 .h 文件中 - 包含其余代码的 .cpp/.cc 文件

显然这也有缺点,因为您的代码现在分为两个不同的文件......

如果您发现我遗漏的问题以及您在这些提案中看到的问题,请告诉我。