我在实时嵌入式系统上运行了一个非常时间敏感的函数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-functions
,g()
未内联,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源文件声明/定义?