强制在另一个翻译单元中内联函数

时间:2016-11-20 17:16:11

标签: gcc optimization inline compiler-optimization

我在实时嵌入式系统上运行了一个非常时间敏感的函数f()。此函数从ARM CMSIS-DSP库调用函数g(),该库由ARM以源代码形式提供,并包含在我的项目中;因此,它与定义f()的源文件不同。 f()是此代码中调用g()的唯一位置,因此它是内联的完美候选者。如果代码是使用-O3但不是-flto编译的,则g()内部f()未内联(通过反汇编代码检查),f()在3.1中运行微秒。但是,在将-flto添加到编译器标志时,g()将被内联,f()现在以1.8微秒的速度运行。

出于开发目的,我宁愿不要一直离开-O3(我通常使用-Og)。对于-Og -flto,甚至是-Og -flto -finline-functionsg()未内联,f()在3.6微秒内运行。遗憾的是,当f()缓慢运行时,应用程序遇到问题,g()内联并且f()运行得更快时会解决问题。将inline添加到g()的定义或相应标头中的声明可能有效,但是我想避免直接编辑CMSIS-DSP库源文件,因为我认为这是不好的软件工程实践(例如,如果发布新版本并且我忘记将更改移植到它,我的应用程序将因缺少内联而再次中断)。

我尝试的事情并没有导致内联函数:

  • #pragma GCC optimize("O3")的定义之前添加f()
  • 在我定义我的函数之前,用g()添加__attribute__((always_inline))的原型。

如何在g()内强制f()内联,同时保留-Og代码的其余部分,而无需编辑g()的CMSIS-DSP源文件声明/定义?

0 个答案:

没有答案