防止gcc内联函数

防止gcc内联函数,c,linux,gcc,x86,C,Linux,Gcc,X86,是否可以防止gcc编译器内联特定函数。如果是,怎么做 不要告诉我降低优化级别。我希望启用所有优化,但将某个特定函数标记为no,并由编译器内联,就像变量中的volatile一样 我之所以要这样做,是因为我的函数使用内联程序集定义的标签,gcc内联函数时会弄乱标签,因为内联会导致gcc创建该标签的多个实例。您应该使用该属性 像这样: void the_method_you_dont_want_to_inline() __attribute__ ((noinline)) { ... } 或在GC

是否可以防止gcc编译器内联特定函数。如果是,怎么做

不要告诉我降低优化级别。我希望启用所有优化,但将某个特定函数标记为no,并由编译器内联,就像变量中的volatile一样

我之所以要这样做,是因为我的函数使用内联程序集定义的标签,gcc内联函数时会弄乱标签,因为内联会导致gcc创建该标签的多个实例。

您应该使用该属性

像这样:

void the_method_you_dont_want_to_inline() __attribute__ ((noinline))
{
  ...
}
或在GCC的最新版本中:

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

您必须为函数设置参数
\uuuuuu属性((noinline))

这看起来像这样:

void __attribute__((noinline)) MyFunction(void)
{
    printf("This will never be inlined");
}
是您将要得到的结束。

应该放在第一位,如下所示。否则,编译器将抱怨函数定义中不允许使用属性

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

另一种方法是为声明提供属性,而不是函数的定义;e、 g

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

static void foo() {
//code here
}
但是,也许您仍然可以通过在函数中使用with
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
来内联函数,例如

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

但是,为了获得更好的帮助,您应该提供更多的细节,也许还应该展示更多的代码和目标

我试过了,但编译器说函数定义上不允许使用属性。我试过了,但编译器说函数上不允许使用属性definition@MetallicPriest:我编辑了我的答案,并更正了gcccompiler的最新版本,错误:函数定义上不允许使用属性。请查看您的问题与的重复。请更准确地解释您的问题。标签的多个实例?这永远不应该发生。gcc的哪个版本给了你这个?您确定只在一个编译单元中定义了函数吗?@Jens,发生这种情况的原因是内联函数直接放置在代码中,因此如果您在该函数中定义了内联程序集标签,编译器也会在为内联函数插入代码的任何地方复制它;您只需使用匿名相对标签(0,…,9)即可。防止内联某些重要到足以包含程序集的内容会产生严重的代码味道。听起来你正在做的事情需要重新思考。这可能确实是唯一的办法,但那肯定是一个极不可能的情况…@MetallicPrist,所以你问错了问题。您感兴趣的是拥有不需要绝对标签的流控制。因为gcc似乎确信您的代码非常小(否则它不会内联),所以这不会太复杂。
static void inline foo() {
   // untested!
   __label__ foo;
  foo:
    asm ("do something tricky");
    goto foo;
}