Tips:inline 与force_inline

2017-10-31  本文已影响0人  dc630f46ee2d

前期准备 函数入栈和出栈

函数每次入栈都会调用call指令,调用后还需要出栈返回到原来调用的地方。这个时间开销实际是比较大的。

247487dfbaf1ec956441e9e5e2f85817_hd.jpg

inline

inline在函数调用的地方展开,减少了调用的时候函数入栈出栈的开销,也就是说一个普通函数调用内联函数,内联函数不会进行出入栈的操作。这个只是一个提示关键字。

编译器会自己决定是否采用内联的方式来展开标记为内联的函数。一旦编译器决定使用内联,那么在编译阶段编译成函数调用而是直接扩展到调用函数体内,最终会导致不需要在在调用的时候将这个函数入栈和出栈,但会造成内存增加(因为每个调用内联的方法都会展开这个内联函数)。这个是一个典型的以空间换时间的方法。

force_inline

#define force_inline __inline __attribute__((always_inline))
force_inline替换为 __inline __attribute__((always_inline)),后者表示强制内联。

inline或者说force_inline的使用场景

1.内联函数内不允许用循环语句和开关语句。
2.由于使用内联函数会增加内存,只适合代码短的函数
3.有些函数使用内联关键字后,依然担心编译器不把它当作内联函数,可以使用强制内联
4.内联的作用和带参数的宏类似,不过多了类型检查,是很多场合下可以代替带参数的宏。

上一篇下一篇

猜你喜欢

热点阅读