引入内联函数的目的,是用来代替宏定义来解决程序中函数调用的效率问题。
好处:可以像宏定义一样提高函数调用效率,同时没有宏定义的缺点(无法进行参数检查所带来的安全隐患)
内联函数必须是和函数体声明在一起才有效,单独声明 Inline Tablefunction(int I)是没有效果的。1
2
3
4Inline tablefunction(int I)
{
return I*I;
}
通过以上代码才可定义一个内联函数。我们可以把它作为一般的函数一样调用,但是执行速度确比一般函数的执行速度要快。
定义在类的外部的函数也可被定义为内联函数,比如:
1 | Class TableClass |
上面声明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数,而不管你是否有inline关键字。
内联函数在C++类中应用最广的,是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行,如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。
1 | Class sample{ |
当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。
小结
- inline定义的内联函数没有了调用开销,效率更高
- 编译器在调用内联函数时,会检查参数类型,确保调用正确,这一点是内联函数比宏定义强的地方
- inline可以作为类的成员函数,从而使用所在类的保护成员及私有成员
- 内联函数的代码不宜过长,否则内存消耗代价较高,效率无法提升
- 如果函数体内出现循环,则执行函数体内代码的时间比函数调用的开销更大
- 构造函数与析构函数也是内联函数,其定义体不要放在类声明中,应该放在类定义的cpp文件中
- 内联函数在编译时展开,宏定义在预编译时展开
- 编译时,内联函数内嵌到目标代码中,而宏定义只是简单的文本替换
- 宏不是函数,内联函数是函数
- 宏由于直接替换文本,极易出现二义性,要小心处理,而内联函数不会