前期准备 函数入栈和出栈
函数每次入栈都会调用call
指令,调用后还需要出栈返回到原来调用的地方。这个时间开销实际是比较大的。
inline
inline
在函数调用的地方展开,减少了调用的时候函数入栈和出栈的开销,也就是说一个普通函数调用内联函数,内联函数不会进行出入栈的操作。这个只是一个提示关键字。
编译器会自己决定是否采用内联的方式来展开标记为内联的函数。一旦编译器决定使用内联,那么在编译阶段编译成函数调用而是直接扩展到调用函数体内,最终会导致不需要在在调用的时候将这个函数入栈和出栈,但会造成内存增加(因为每个调用内联的方法都会展开这个内联函数)。这个是一个典型的以空间换时间的方法。
force_inline
#define force_inline __inline __attribute__((always_inline))
将force_inline
替换为 __inline __attribute__((always_inline))
,后者表示强制内联。
inline
或者说force_inline
的使用场景
1.内联函数内不允许用循环语句和开关语句。
2.由于使用内联函数会增加内存,只适合代码短的函数
3.有些函数使用内联关键字后,依然担心编译器不把它当作内联函数,可以使用强制内联
4.内联的作用和带参数的宏类似,不过多了类型检查,是很多场合下可以代替带参数的宏。
网友评论