1. 内联函数的作用
inline 和 宏定义#define的作用基本类似,都是替换或者展开。 在程序编译阶段,如果遇到内联函数,则将内联函数的实现在当前位置展开。内联的目的是为了减少函数的调用开销,从而提高运行效率,但会增加代码体量。
注意: 内联只是一种建议,并不要求编译器必须执行。如果内联函数本身开销较大(含有for,switch,递归等),编译器可能拒绝内联展开。
2. 内联函数的实现
内联函数的实现比较简单,即在 函数定义体 前加上“inline”关键字。
注意: 仅在函数声明前加上 “inline”是不起作用的,必须加在函数定义体前。
比如,下面的实现就是无效的:
inline int add(int a, int b);
int add(int a, int b)
{
return a + b;
}
3. 内联函数的优缺点
优点:
(1)通过避免函数的回调,加速了程序的执行;
(2) 通过利用指令缓存,增强局部访问性;
(3)使用内联可以替换重复的短代码,方便代码管理;
缺点:
(1) 由于是替换展开,因此会增大代码体量;
(2)一旦修改内联,所有用到该内联的地方都需要重新编译;
4. 内联函数的使用场景
(1)需要提高程序运行效率;
(2)需要用内联替代宏定义来实现某些功能;
(3)在类中声明同时定义的成员函数,自动转化为内联函数,如果需要隐藏该函数的实现细节,则在类外定义内联;
5. 内联函数与宏的区别
(1)内联函数可调试,而宏定义不行;
(2)内联函数首先是函数,函数的很多性质都适用于内联函数,如:内联函数可以重载;编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
(3)内联函数可以访问类的私有成员变量,宏定义则不能;