C++类里面的哪些成员函数是内联函数
1.隐式内联
class Person
{
public:
Person(const string &name)
{
Name = name;
}
void printName()//printName 定义在类里面是隐式内联函数
{
cout << Name << endl;
}
private:
string Name;
};
2.在类里面显示声明,在类外面定义
class Person
{
public:
Person(const string &name)
{
Name = name;
}
inline void printName();//成员被函数前加了inline是显式内联函数
//在类里面显式声明
private:
string Name;
};
void Person::printName()
{//在类外面定义
cout << Name << endl;
}
3.“追加”内联。表示在类里面没有显式声明,在类外显示定义了内联。
class Person
{
public:
Person(const string &name)
{
Name = name;
}
void printName();
//在类里面没有显式声明
private:
string Name;
};
inline void Person::printName()//成员被函数前加了inline是显式内联函数
{//在类外面显式定义
cout << Name << endl;
}
4.第四种常见的成员函数不是内联函数。定义不再类里面,且声明和定义都没有inline。
class Person
{
public:
Person(const string &name)
{
Name = name;
}
void printName();
//在类里面没有显式声明
private:
string Name;
};
void Person::printName()//不是内联函数
{//在类外面也没有显式定义
cout << Name << endl;
}
C++内联函数
c 语言中有宏函数的概念。宏函数的特点是内嵌到调用代码中去,避免了函数调用的开销。
但是由于宏函数的处理发生在预处理阶段,缺失了语法检测和有可能带来的语意差错。
比如以下几种情况:
//定义一个计算平方的宏函数
#define SQUARE(X) (X*X)
//这不是通过传递参数,而是通过文本替换的方式来实现的
a=SQUARE(5.0) //会被替换为5.0*5.0
b=SQUARE(4.5+7.5) //会被替换为4.5+7.5*4.5+7.5
c=SQUARE(c++) //会被替换为c++*c++
//上述示例只有第一个能正常工作,可以通过使用括号来改进
#define SQUARE(X) ((X)*(X)
//但依然存在问题:不能按值传递,如第三个中,会先将c++然后计算c平方,不符合预期结果(先计算c平方,再指向c++)
因此有了内联函数(inline function)
要使用该特性,必须采取下列措施之一:
-
在函数声明前加关键字inline;
-
在函数定义前加关键字inline;
通常做法是省略原型,将整个定义(函数头和实现代码)放在函数声明的地方。
评价
优点:避免函数调用时的额外开销
缺点:由于内联函数的函数体在代码段中会出现多个“副本”,因此会增加代码段的空间。
本质:以牺牲代码段空间为代价,提高程序的运行时间的效率。
适用场景:函数体很“小”,且被“频繁”调用。
网友评论