在C++中时常会提到内联函数的概念,而内联函数在C++中的使用也是相当普遍的。从内联函数的定义上可以知道,内联函数在使用上有类似宏替换的作用,即在对程序进行编译的时候,直接使用程序的函数体来代替函数名。

内联函数的种类:


内联函数主要分成两种,一种是类成员内部的内联函数,一种是类外面的全局内联函数。


首先,先对类成员内部的内联函数进行说明,在C++的类成员中,如果成员函数的函数体本身结构不复杂,代码量也较少的时候,直接在定义这个函数的时候就完成该函数的实现,这样的一个过程在C++类中会被默认当做内联函数。构造函数在某些情况下就是一个较为典型的内联函数。下面为类成员内部的内联函数示例:

1. class test  
2. {  
3. public:  
4. int a;  
5. int b;  
6. int c;  
7. int addresult()  
8.     {  
9. return a+b+c;  
10.     }  
11. protected:  
12. private:  
13. };
  1.  

当然,当类成员函数的定义在内部,实现的时候在外部实现,也需要在前面加上关键字inline,就能够告诉编译器这是一个内联函数了,这个与全局函数区别不大。


其中addresult即为类内部的内联函数。



第二种为类外部的内联函数,当将一个全局函数定义成内联函数的时候,需要加一个inline 的关键字说明,相当于告诉编译器建议将该函数当内联函数进行处理。例如:


1. inline double Mul(int a,int b)  
2. {  
3. return a*b;  
4. }



内联函数的作用:



当使用内联函数的时候,起目的是为了消除函数调用上的开销,频繁的调用函数会增加内存上的开销。在传统C中对减少调用引起的内存消耗的方法是宏定义。但是宏定义存在着很多的问题,首先宏定义是预处理器来执行命令的,而不是编译器。而预处理器执行的宏命令是对其进行单纯的词语替换,没有任何的语法分析可言。同时,在使用宏命令的时候往往会引发一些很容易被忽略掉的错误。鉴于预处理命令的诸多不足,所以在《Effective C++》一书中就提到了“尽量少用预处理器,而多用编译器”。



在C++中对减少函数调用引起的内存消耗显得方法就巧妙多了,所以在C++中可以使用内联函数来代替宏命令。



使用内联函数的注意点:





使用内敛函数的主要作用是减少函数调用引起的过多的内存消耗,但是物极必反,在使用内联函数中应当要注意一些地方:



  • 虽然在使用中将函数定义成内联函数,但是对于编译器而言不一定会将所有内联函数均那么操作,对于编译器而言,定义成内联函数只是对编译器操作的一种建议。
  • 在定义内联函数应当尽量定义成那些调用非常频繁而且函数功能简单的函数,而不能将函数实现很复杂的功能定义成内联。
  • 由于内联函数在调用的时候直接暴露出了函数体,故会造成泄漏函数功能的现象。
  • 在内联函数中尽量减少变量的申请,尽量简化内联函数的函数体,这也对程序结构有好处。