gcc -finline-functions行为?

时间:2010-03-16 00:01:03

标签: c++ gcc inline

我正在使用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;
}

3 个答案:

答案 0 :(得分:4)

docs for GCC's noinline说:

  

此函数属性可防止将内联函数考虑在内。如果函数没有副作用,那么除了内联之外,还有一些优化会导致函数调用被优化掉,尽管函数调用是实时的。为了防止此类调用被优化,请添加

     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以专门化该功能。