gcc -finline-functions行为?

use*_*168 6 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;
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 4

GCC 的文档noinline说:

此函数属性可防止函数被考虑内联。如果函数没有副作用,则尽管函数调用是实时的,但除了内联之外还有其他优化会导致函数调用被优化掉。为了防止此类调用被优化,请放置

     asm ("");
Run Code Online (Sandbox Code Playgroud)

(参见扩展汇编)在被调用函数中,作为特殊的副作用

我认为您可能会遇到的情况是,由于该Base::fooT<>函数没有副作用,GCC 正在调用上面提到的未指定的其他优化。