在阅读别人的开源源码时,经常发现一些函数前加了关键字inline,上网查了下,这是内联函数的声明方式。
其主要的特点省去函数调用的开销,提高代码执行效率。
为什么能省去函数调用的开销?内联函数是以复制代码为代价来提高效率的,也就是在程序编译阶段,注意是在程序编译阶段,把内联函数体复制到调用点的函数体中,所以就省去了函数调用的开销。既然有复制函数体,所以有几点需要注意。
inline int max(int vA, int vB)
{
return vA > vB ? vA : vB;
}
- 内联函数体不易过长,不然占用内存空间
- 应避免内联函数的执行时间过长,比如for等循环语句,因为虽然能省去函数调用开销,但是与执行时间相比,是得不偿失
- 内联函数应放在头文件中,避免多次#include带来的函数重定义
- 内联函数是针对函数定义的关键字,而不是声明的关键字,所以inline 的函数接着是函数的实现
class CMyInline
{
public:
CMyInline(void){}
~CMyInline(void){}
int getNum()const {return m_Num;}
private:
int m_Num;
};
我们可以给函数加上inline关键字,但是编译器有权决定他是不是内联函数,其原则就是代码块长短,执行时间,开辟空间等。而在类中,除开模板函数,函数的实现体通常是放在cpp中。而get,set函数的实现通常写在函数类中,因为编译器默认会给类的成员函数添加inline。
- inline函数中不包含static关键字,因为有可能出现多个相同的static变量,是不被允许的。
- inline虚函数是无效的,因为inline是程序编译时间确定,而虚函数是运行时间阶段确定。
- 类的构造函数和析构函数不是inline的选择,因为其本身类可能函数体是简单的,但是父类的函数体可能存在复杂的情况,所以通常编译器不会认为构造函数和析构函数是inline函数。
【参考资料】
【1】http://www.cnblogs.com/berry/articles/1582702.html
【2】http://blog.csdn.net/imyfriend/article/details/12676229