Gcc 强制将函数内联到另一个转换单元中
我有一个非常时间敏感的函数Gcc 强制将函数内联到另一个转换单元中,gcc,optimization,inline,compiler-optimization,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微秒内运行 出于开发目的,我不希
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函数
,g()
不是内联的,f()
运行时间为3.6微秒。不幸的是,当f()
运行得太慢时,应用程序会遇到问题;当g()
内联且f()
运行得更快时,问题就会得到解决。将<代码>内联< /代码>定义为<代码>()>代码>或相应的报头中的声明可能起作用,但是我不想直接编辑CMIS-DSP库源文件,因为我认为软件工程实践不好。(例如,如果发布了一个新版本,而我忘记将更改移植到它,我的应用程序将由于缺少内联而再次中断)
我尝试了一些没有导致函数内联的事情:
- 在定义
之前添加f()
#pragma GCC optimize(“O3”)
- 在定义函数之前,为
添加一个带有g()
的原型\uuuu属性((始终为内联))
g()
内联到f()
中,同时保持-Og
用于此代码的其余部分,而不必编辑声明/定义g()
的CMSIS-DSP源文件