inline函数
inline函数
有时候函数实现的功能是一个小的操作,但是写成函数有一个潜在的缺点,调用函数比求解等价表达式要慢得多,以及调用函数都要做很多工作。即对于这种简短的语句来说使用函数开销太大,使用宏函数可以提高效率,减少这种开下,但是宏函数不好阅读,且容易出错,由此引出了inline函数
1.内联函数
内联函数是C++的增强特性之一,用来降低程序的运行时间。
在代码中在一个函数的定义之前加上inline关键字,就是对编译器提出了内联的建议。如果建议通过,就会进行内联展开。
当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。
定义函数时,在函数的最前面以关键字“inline”声明函数,该函数即可称为内联函数(内联声明函数)。
1
2
3
4
5 inline int max(int x, y)
{
return x > y ? x : y;
}—— 内联函数就是在普通函数定义之前加上inline关键字
(1)inline是一个建议,并不是强制性的,后面会学到inline失效的情况
(2)inline的建议如果有效,就会在编译时展开,可以理解为是一种更高级的代码替换机制(类似于宏——预处理)
(3)函数体内容如果太长或者有循环之类的结构,不建议inline,以免造成代码膨胀;比较短小的代码适合用inline。
比如函数体中有循环结构,那么执行函数体的开销比调用函数的开销大得多,设为内联函数只能减少函数调用的开销,没有太大意义。
C++的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作类的数据成员,所以在C++中应尽可能的用内联函数取代宏函数。
对比总结:
宏函数 优点:只是进行字符串的替换,并没有函数的开销,对于比较短小的代码适合使用;
缺点:没有类型检查,存在安全隐患,而且比较容易写错。
如果使用普通函数的方式又会增加开销,所以一些时候可以采用内联函数(结合了宏函数和普通函数的优点)。
inline函数本质也是字符串替换(编译时),所以不会增加开销,但是有类型检查,比较安全。
inline函数在头文件中必须有定义
要谨慎使用内联