内联函数
又被称为在线函数或编译时期展开函数,是指在用inline修饰的函数(这里指的是C++或者C语言的函数)。
与普通函数的区别
函数不管是OC还是C/C++最终都需要编译成汇编指令,才能真正执行。
普通函数在被调用的时候需要CPU执行CALL指令不同(需要完成程序计数器压栈->执行要执行的函数语句->出栈程序计数器)。
内联函数不需要这个调用过程,内联函数在编译的时候,会直接在需要执行内联函数的地方(普通函数执行CALL的汇编语句处)将内联函数的汇编片段copy一份并插入到此处,代替CALL指令(类似于宏定义),而不需要普通函数的CALL指令调用过程。
因此内联函数的执行效率是比较高的,但是由于copy代码片段,需要内存消耗,所以内联函数是一种以空间换时间的方法
与宏定义的区别
宏定义只是简单的字符串替换,是不能做类型检查,内联函数相比而言就会更加安全
注意事项
- inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”
关键字inline必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用。如下风格的函数Foo不能成为内联函数:
inline void Foo(int x, int y); // inline仅与函数声明放在一起
void Foo(int x, int y) {
}
如下风格的函数Foo则成为内联函数:
void Foo(int x, int y);
// inline与函数定义体放在一起
inline void Foo(int x, int y) {
}
- 内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。
如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。
每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大
网友评论