我正在使用gcc和-finline-functions优化发布版本。为了对抗代码膨胀,因为我在嵌入式系统上工作,我想说不要内联特定的功能。这样做的显而易见的方法是通过函数属性,即属性(noinline)。问题是,当我打开作为-O3开关一部分的全局-finline-functions优化时,这似乎不起作用。
它也与它被模板化有关,因为同一函数的非模板化版本没有内联,这是预期的。
有没有人知道如何在启用此全局开关时控制内联?
以下是代码:
#include <cstdlib>
#include <iostream>
using namespace std;
class Base
{
public:
template<typename _Type_>
static _Type_ fooT( _Type_ x, _Type_ y ) __attribute__ (( noinline ));
};
template<typename _Type_>
_Type_ Base::fooT( _Type_ x, _Type_ y )
{
asm("");
return x + y;
}
int main(int argc, char *argv[])
{
int test = Base::fooT( 1, 2 );
printf( "test = %d\n", test );
system("PAUSE");
return EXIT_SUCCESS;
}
答案 0 :(得分:4)
此函数属性可防止将内联函数考虑在内。如果函数没有副作用,那么除了内联之外,还有一些优化会导致函数调用被优化掉,尽管函数调用是实时的。为了防止此类调用被优化,请添加
asm ("");
(参见Extended Asm)在被调用的函数中,作为特殊的副作用
我认为可能发生的事情是,由于Base::fooT<>
函数没有副作用,GCC正在调用上面提到的未指定的其他优化。
答案 1 :(得分:1)
尝试将noinline
属性放在static
之后和定义之前,如下所示:
template<typename _Type_>
static __attribute__ (( noinline )) _Type_ fooT( _Type_ x, _Type_ y );
这对我有用,似乎也适用于其他人,请参阅:How can I tell gcc not to inline a function?
出于某种原因,尽管noinline
文档说的是asm("")
,但在函数之后放置gcc
属性或将{{1}}置于函数体中是不行的。
答案 2 :(得分:1)
小旧帖但值得回答。 如果以上任何内容都不适合您,则总会有简单的解决方法。您必须通过将其放在另一个cpp文件中来隐藏要使用此类方法的翻译单元的实现。
修改强>
在GCC&gt; = 4.5中,有一个属性noclone
取代noinline
以专门化该功能。