我如何告诉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)) { } 

当你声明外部使用函数和写函数的时候,你应该使用它。