gpt4 book ai didi

c++ - 在 GCC、Clang 和英特尔编译器中强制内联单个宏?

转载 作者:可可西里 更新时间:2023-11-01 17:59:27 25 4
gpt4 key购买 nike

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

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

充实要求。我正在寻找一个允许我执行类似操作的宏:

#define force_inline <something here>

在标题中:

force_inline void foo();

我应该能够在实现文件中做到这一点:

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

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

有没有一种方法可以使用适用于所有这些编译器的宏来实现内联?

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

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

看来ICC既需要inline(与内联代码无关),也需要header中的完整实现来保证函数的内联。

PS:是的,我已经测量了我的性能,并且我知道一个事实,即内联函数比不内联函数更快。不,编译器不会为我做这件事。

最佳答案

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

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

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

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

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

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

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

如果您看到我遗漏的问题而您在这些命题中看到了,请告诉我。

关于c++ - 在 GCC、Clang 和英特尔编译器中强制内联单个宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27112043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com