C++之内联函数

引入内联函数的目的,是用来代替宏定义来解决程序中函数调用的效率问题。
好处:可以像宏定义一样提高函数调用效率,同时没有宏定义的缺点(无法进行参数检查所带来的安全隐患)

内联函数必须是和函数体声明在一起才有效,单独声明 Inline Tablefunction(int I)是没有效果的。

1
2
3
4
Inline tablefunction(int I)
{
return I*I;
}

通过以上代码才可定义一个内联函数。我们可以把它作为一般的函数一样调用,但是执行速度确比一般函数的执行速度要快。

定义在类的外部的函数也可被定义为内联函数,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Class TableClass
{
 Private:
  int i,j;
 Public:
  int add() { return i+j;};
  inline int dec() { return i-j;}
  int GetNum();
}

inline int tableclass::GetNum()
{
return i;
}

上面声明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数,而不管你是否有inline关键字。

内联函数在C++类中应用最广的,是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行,如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。

1
2
3
4
5
6
7
Class sample{
 Private:
  Int nTest;
 Public:
  Int readtest(){ return nTest;}
 Void settest(int I) {nTest=I;}
}

当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。

小结

  • inline定义的内联函数没有了调用开销,效率更高
  • 编译器在调用内联函数时,会检查参数类型,确保调用正确,这一点是内联函数比宏定义强的地方
  • inline可以作为类的成员函数,从而使用所在类的保护成员及私有成员
  • 内联函数的代码不宜过长,否则内存消耗代价较高,效率无法提升
  • 如果函数体内出现循环,则执行函数体内代码的时间比函数调用的开销更大
  • 构造函数与析构函数也是内联函数,其定义体不要放在类声明中,应该放在类定义的cpp文件中
  • 内联函数在编译时展开,宏定义在预编译时展开
  • 编译时,内联函数内嵌到目标代码中,而宏定义只是简单的文本替换
  • 宏不是函数,内联函数是函数
  • 宏由于直接替换文本,极易出现二义性,要小心处理,而内联函数不会