强制与 GCC、Clang 和英特尔编译器中的单个宏内联

Forcing inline with a single macro in GCC, Clang and Intel Compiler?

本文关键字:编译器 单个宏 英特尔 GCC Clang      更新时间:2023-10-16

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

我希望该函数在与标头不同的文件中实现,并且仍然强制它在使用它的任何地方内联。另外,我想同时使用clang,GCC和Intel编译器进行编译。

充实要求。我正在寻找一个宏,可以让我执行以下操作:

#define force_inline <something here>

在标题中:

force_inline void foo();

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

void foo() {... Code.. }

需要明确的是,我不想将代码放在我的标头中。我希望它们只包含函数的声明。

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

到目前为止,我拥有的最佳解决方案是以下宏:

#define forceinline inline __attribute__((always-inline))

ICC似乎需要inline(与内联代码无关)和标头中的完整实现来保证函数的内联。

PS:是的,我已经测量了我的表现,我知道内联函数比不内联更快。不,编译器不会为我做这件事。

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

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

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

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

解决方案 1:您可以保留一个"干净的类",而无需在标头中实现,并将内联函数放在类之外(但仍在标头中)。标题中仍有定义,但它与声明明显分开,因此对可读性的影响较小。(这是我个人首选的解决方案)

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

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

请告诉我,如果你看到我错过的问题,以及你在这些命题中看到的问题。