【发布时间】:2015-01-22 14:10:27
【问题描述】:
我有一个函数需要在 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:是的,我已经测量了我的性能,并且我知道将函数内联比不内联更快。不,编译器不会为我这样做。
【问题讨论】:
-
使用
gcc -flto -O2编译和链接。或者更好的是在你的头文件中将你的函数定义为static inline。 -
答案太多?我正在寻找同时适用于所有三个编译器的宏。
-
@BasileStarynkevitch: 明确一点:我不想在头文件中实现函数,只需要声明
-
这是显而易见的,即使答案是“否”。
-
Per N4140 [dcl.fct.spec]/4:“内联函数应在使用 odr 的每个翻译单元中定义,并且在每种情况下都应具有完全相同的定义 (3.2 )。”如果您将单个定义放在头文件中并将其包含在 ODR 使用它的每个 TU 中,则更容易避免 ODR 违规。将定义复制到多个实现文件中当然会产生同样的效果,但我认为它更肮脏。