inline关键字


inline关键字

在函数声明和定义加上,使之称为内联函数。如果一些简单的函数直接在类中声明并且定义,编译器可以将其优化为内联函数。

注:内联函数可以减少函数的执行时间:原因是它可以在使用时直接进行替换(像宏一样展开),从而避免出现参数压栈、代码生成等操作,但是如果函数体过大,编译器就不会将其作为内联函数,即使加了关键字inline,同时内联函数不能递归。

inline关键字声明的函数依旧是函数,所以会有类型检查,可以消除C语言宏的一些缺点。

关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。

慎用 inline

内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?如果所有的函数都是内联函数,还用得着”内联”这个关键字吗?  内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。  如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间,是以空间换时间,这是一种常用的手段,因为时间总是更加宝贵的。

以下情况不宜使用内联:  (1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。  (2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如”偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了 inline 不应该出现在函数的声明中)。

使用参考

#include <iostream>  
#include <string>  
 
using namespace std;
 
class Person
{
public:
	inline void display();
	string name;
};
 
inline void Person::display()
{
	cout << "name:" << name << endl;
}
 
int main()
{
	Person person;
	person.name = "Erin";
	person.display();
	return 0;
}
//如果将display直接在类内定义,会被自动关联为inline函数

文章作者: AllenMirac
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AllenMirac !
  目录