【问题标题】:((always_inline)) does not work when function is implemented in different file((always_inline)) 在不同文件中实现功能时不起作用
【发布时间】:2014-06-18 15:32:31
【问题描述】:

我有一个文件funcs.h,其中有函数声明:

inline void some_func( void ) __attribute__((always_inline));

然后我有一个文件funcs.c,其中有函数的实现:

inline void some_func( void ) { … }

然后在我的主文件main.c#include funcs.h 并尝试在代码中的某处使用some_func()。然而,当我编译我的程序并查看二进制文件时,该函数似乎被编译为一个常规的单独函数,并且像任何其他常规函数一样被调用,而不是作为内联函数嵌入。

为什么会发生这种情况,有没有办法强制实际内联? (当然,只使用#define 宏而不是函数的选项除外。)

【问题讨论】:

  • 编译器应该如何内联编译后找到的定义?
  • 您必须打开链接时优化(-flto 开关)。
  • @ghostofstandardspast 不是编译器,而是链接器。
  • @user3477950,我想这是一个很好的观点。我记得微软说过链接器可以做的优化。
  • @user3477950 简单的测试表明,即使a+b 函数也没有与 gcc 4.8 和 -flto 内联。此外,使用此属性会产生编译错误,因为编译器肯定知道它不能内联,而程序员坚持认为它应该。

标签: c gcc inline-functions


【解决方案1】:

把实现放在头上。如果它们在您打算进行内联的翻译单元中不可用,那么您将不走运。链接器(嗯,传统的链接器)无法为您做任何事情。

【讨论】:

  • 大多数现代工具链都支持链接时优化,依靠它可能是一个更好的主意,将大量定义转储到标题中。
  • @user3477950:是的,虽然依赖编译器优化使得force_inline-attribute 是多余的。
  • @Deduplicator ...它告诉我应该将低级优化留给编译器,尤其是现在。
  • 在头文件中,如果是C而不是C++,它应该是static inlineinline 本身不会将函数标记为不可导出(但在 C++ 中会)。
猜你喜欢
  • 2020-04-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多