强制与 GCC、Clang 和英特尔编译器中的单个宏内联
Forcing inline with a single macro in GCC, Clang and Intel Compiler?
我有一个函数,我需要在 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 文件
显然,这也有缺点,因为您的代码现在被分成两个不同的文件......
请告诉我,如果你看到我错过的问题,以及你在这些命题中看到的问题。
- MSVC多行宏编译器错误
- 有没有办法在从编译器获取参数时避免预处理器宏?
- __CHAR_BIT__宏是否为 MSVC 编译器预定义?
- 在使用包含冒号的类似函数的宏时,是什么导致了这种编译器差异?
- 如何创建独立于平台的宏来包装编译器扩展?
- 用于引发字符串文本C++的编译器错误的宏
- 重写基类中的编译器宏
- C++ 使用宏定义单个类的类成员
- 宏函数 _T() 导致编译器错误
- 为 libclang 全局设置 -D 宏编译器标志
- 是否有一个可视化 c++ 预定义的预处理器宏,让您知道编译器何时优化
- 将多个参数作为单个宏参数传递
- 任何人都可以解决此GCC编译器错误:宏"min"传递了3个参数,但只需要两个参数
- 将某些代码行包装到单个宏中的方法
- 默认构造函数的宏可能,等待编译器支持
- 如何使用 qmake 为单个源文件指定编译器标志
- 不定义专有编译器宏潜伏着什么危险
- 强制与 GCC、Clang 和英特尔编译器中的单个宏内联
- 轻松标记++如何使用单个宏进行配置
- 在C或c++源文件中展开单个宏