防止gcc内联函数

时间:2011-11-02 11:26:46

标签: c linux gcc x86

是否可以阻止gcc编译器内联特定函数。如果是这样,怎么样?

不要告诉我降低优化级别。我想要所有的优化,但标记一个特定的函数不被编译器内联,就像变量的情况下的volatile一样。

我想要这样做的原因是因为我的函数使用内联汇编定义的标签,gcc在内联函数时会搞砸,因为内联会导致gcc创建该标签的多个实例。

6 个答案:

答案 0 :(得分:13)

您应该使用noinline属性

像这样:

void the_method_you_dont_want_to_inline() __attribute__ ((noinline))
{
  ...
}

或最近版本的GCC:

__attribute__((noinline)) void the_method_you_dont_want_to_inline()
{
  ...
}

答案 1 :(得分:2)

void foo() __attribute__ ((noinline)) { }

答案 2 :(得分:2)

您必须将参数__attribute__((noinline))设置为函数。

这看起来像这样:

void __attribute__((noinline)) MyFunction(void)
{
    printf("This will never be inlined");
}

答案 3 :(得分:2)

__attribute__(noinline)是您将要获得的关闭。

答案 4 :(得分:1)

首先应放置

__attribute__(noinline),如下所示。否则编译器会抱怨函数定义不允许使用属性。

__attribute__(noinline) void my_function( void * arg )
{
  .....
}

答案 5 :(得分:1)

另一种方法是给出声明的属性,而不是函数的定义; e.g。

static void foo() __attribute__ ((noinline));

以后

static void foo() {
//code here
}

但也许你仍然可以在local labels里面使用__label__来内联函数,比如

static void inline foo() {
   // untested!
   __label__ foo;
  foo:
    asm ("do something tricky");
    goto foo;
}

但是 MetallicPriest ,您应该提供更多详细信息,并且可能会显示更多代码和目标,以获得更好的帮助!