GCC编译代码时,会自动判断函数是否可以被inline。指定为“inline”的函数,可能被inline,也可能不被inline;没有指定“inline”的函数,也有可能被inline。 但是,有时出于特殊需要,我们希望某个函数强制不得被inline。例如,直接操作寄存器的汇编函数等。 如何强制不inline呢? ## 方法1:使用__ attribute __((noinline))关键字 ```cpp void func_a() __attribute__((noinline)) void func_a() { ... ... } ``` 遗憾的是,虽然使用了上述关键字,但是GCC还是有可能inline该函数。 ## 方法2:将函数实现放到被调用处后面,通常GCC不会inline此类函数。 (经验证,此方法不能保证不被inline) ```cpp void func_a() __attribute__((noinline)) void call_func() { ... ... func_a(); ... ... } // func_a实现后置 void func_a() { ... ... } ``` ## 方法3:使用函数指针 ```bash void func_a() { ... ... } void (* ptr_func)() = &func_a; // 函数指针,ptr_func必须是全局的。 void call_func() { ... ... ptr_func (); ... ... } ``` 可以将上述方法1和3同时使用,确保不被inline。