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源文件