GCC编译代码时,会自动判断函数是否可以被inline。指定为“inline”的函数,可能被inline,也可能不被inline;没有指定“inline”的函数,也有可能被inline。

但是,有时出于特殊需要,我们希望某个函数强制不得被inline。例如,直接操作寄存器的汇编函数等。

如何强制不inline呢?

方法1:使用__ attribute __((noinline))关键字

snippet.cpp
void func_a() __attribute__((noinline))
void func_a()
{
    ... ...
}

遗憾的是,虽然使用了上述关键字,但是GCC还是有可能inline该函数。

方法2:将函数实现放到被调用处后面,通常GCC不会inline此类函数。

(经验证,此方法不能保证不被inline)

snippet.cpp
void func_a() __attribute__((noinline))
void call_func()
{
    ... ...
    func_a();
    ... ...
}
 
// func_a实现后置
void func_a()
{
    ... ...
}

方法3:使用函数指针

snippet.bash
void func_a()
{
    ... ...
}
 
void (* ptr_func)() = &func_a; // 函数指针,ptr_func必须是全局的。
void call_func()
{
    ... ...
    ptr_func ();
    ... ...
}

可以将上述方法1和3同时使用,确保不被inline。