内联函数inline

1. 内联函数的作用

inline 和 宏定义#define的作用基本类似,都是替换或者展开。 在程序编译阶段,如果遇到内联函数,则将内联函数的实现在当前位置展开。内联的目的是为了减少函数的调用开销,从而提高运行效率,但会增加代码体量。

注意:内联只是一种建议,并不要求编译器必须执行。如果内联函数本身开销较大(含有for,switch,递归等),编译器可能拒绝内联展开。

2. 内联函数的实现

内联函数的实现比较简单,即在 函数定义体 前加上“inline”关键字。

注意:仅在函数声明前加上 “inline”是不起作用的,必须加在函数定义体前。
比如,下面的实现就是无效的:

1
2
3
4
5
6
inline int add(int a, int b);
int add(int a, int b)
{
return a + b;
}

3. 内联函数的优缺点

优点:

  • 通过避免函数的回调,加速了程序的执行;
  • 通过利用指令缓存,增强局部访问性;
  • 使用内联可以替换重复的短代码,方便代码管理;

缺点:

  • 由于是替换展开,因此会增大代码体量;
  • 一旦修改内联,所有用到该内联的地方都需要重新编译;

    内联函数的使用场景

  • 需要提高程序运行效率;
  • 需要用内联替代宏定义来实现某些功能;
  • 在类中声明同时定义的成员函数,自动转化为内联函数,如果需要隐藏该函数的实现细节,则在类外定义内联;

内联函数与宏的区别

  • 内联函数可调试,而宏定义不行;
  • 内联函数首先是函数,函数的很多性质都适用于内联函数,如:内联函数可以重载;编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
  • 内联函数可以访问类的私有成员变量,宏定义则不能;