是否可以阻止gcc编译器内联特定函数。如果是这样,怎么样?
不要告诉我降低优化级别。我想要所有的优化,但标记一个特定的函数不被编译器内联,就像变量的情况下的volatile一样。
我想要这样做的原因是因为我的函数使用内联汇编定义的标签,gcc在内联函数时会搞砸,因为内联会导致gcc创建该标签的多个实例。
答案 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 ,您应该提供更多详细信息,并且可能会显示更多代码和目标,以获得更好的帮助!