我如何告诉gcc不要内联一个函数?
说我有一个源文件中的这个小函数
static void foo() {}
并build立了我的二进制文件的优化版本,但我不希望这个函数内联(为了优化的目的)。 有没有我可以在源代码中添加一个macros来防止内联?
你需要gcc
noinline
属性。
这个函数属性防止一个函数被考虑用于内联。 如果函数没有副作用,除了内联以外,还有一些优化可以使函数调用被优化掉,尽pipe函数调用是实时的。 为了避免这样的调用被优化,把
asm ("");
像这样使用它:
void __attribute__ ((noinline)) foo() { ... }
海湾合作委员会有一个开关叫
-fno-inline-small-functions
所以当使用gcc的时候使用它。 但副作用是所有其他小函数也是非内联的。
一个可移植的方法是通过一个指针调用函数:
void (*foo_ptr)() = foo; foo_ptr();
虽然这会产生不同的分支指令,这可能不是你的目标。 这提出了一个好点:你的目标是什么?
如果你得到__attribute__((noinline))
的编译器错误,你可以试试:
noinline int func(int arg) { .... }
static __attribute__ ((noinline)) void foo() { }
这是为我工作。
使用noinline
属性 :
int func(int arg) __attribute__((noinline)) { }
当你声明外部使用函数和写函数的时候,你应该使用它。