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:是的,我已经测量了我的表现,而且我知道一个事实是内联函数比没有更快.不,编译器不会为我做这件事.
根据定义,内联函数的代码(由编译器)包含在调用它的每个位置。
这意味着编译器在构建调用者编译单元时需要能够访问函数的代码。这在技术上是可行的,但并不容易且难以扩展。请注意,如果您仅分发标头和库,则意味着使用您的组件的编译器必须从库中检索代码!
如果由编译器实现,则意味着您不会像常规函数那样从标头中包含代码中受益(更改 CPP 文件将需要根据标头重新编译所有文件,即使它没有更改) 。唯一的好处是拥有一个不包含代码的标头(这仍然是一件好事)。
我知道的当前唯一可用的解决方案是 GCC 的链接时间优化,因此不满足您使用 clang 和 icc 的要求:https://gcc.gnu.org/wiki/LinkTimeOptimization 也许存在类似的解决方案具有特定选项的编译器,这需要执行编译器相关代码来支持它。
解决方案 1: 您可以保留一个“干净的类”,而不在标头中进行任何实现,并将内联函数放在类的外部(但仍在标头内)。标头中仍然有定义,但它与声明明显分开,因此对可读性的影响较小。(这是我个人更喜欢的解决方案)
解决方案 2: 如果您确实只需要标头中的声明,则缓解问题的另一种方法是将代码分成 3 个文件而不是 2 个: - 仅包含接口的 .h 文件 - 包含内联函数的 .i 文件并包含在 .h 文件中 - 包含其余代码的 .cpp/.cc 文件
显然这也有缺点,因为您的代码现在分为两个不同的文件......
如果您发现我遗漏的问题以及您在这些提案中看到的问题,请告诉我。