一、内联函数的一般形式
内联函数的定义与普通函数基本相同,只是在函数定义前加上关键字 inline。
inline void print(char *s)
{
printf("%s", s);
}
二、使用内联函数的目的
1、代替部分#define宏定义
1)宏是预处理指令,在预处理的时候把所有的宏名用宏体来替换;内联函数是函数,在编译阶段把所有调用内联函数的地方把内联函数插入;
2)宏没有类型检查,无论对还是错都是直接替换;而内联函数在编译时进行安全检查;
3)宏的编写有很多限制,例如只能写一行,不能使用return控制流程等;
4)对于C++ 而言,使用宏代码还有另一种缺点:无法操作类的私有数据成员。
2、代替普通函数,提高程序运行效率
函数调用是有时间和空间开销的,内联函数有类似于宏展开的替换机制,即在函数调用处直接嵌入函数体,节省了函数调用的时间和空间消耗,同时也造成了代码膨胀。
三、内联函数怎么用
内联函数主要用在函数体较短且被频繁调用的场景
1、普通内联函数
内联展开是在编译时进行的,只有链接的时候源文件之间才有关系。所以内联要想跨源文件必须把实现写在头文件里。如果一个内联函数会在多个源文件中被用到,那么必须把它定义在头文件中。
普通内联函数的调用
#include<iostream>
using namespace std;
inline int max(int i, int j, int k) {
if (i<j)
{
i = j;
}
if (i < k) {
i = k;
}
return i;
}
int main() {
int i = 1, j = 2, k = 3;
int bigest = max(i, j, k);
cout << bigest << endl;
return 0;
}
2、类成员函数隐式内联
C++中在类内定义的所有函数都自动称为内联函数,类的成员函数的定义直接写在类的声明中时,不需要inline关键字
/**
*在类里定义的成员函数会被默认的认为是指定为内置函数
*/
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
void display()
{
cout << "name:" << name << endl;
}
string name;
};
int main(int argc, char* argv[])
{
Person person;
person.name = "Erin";
person.display();
return 0;
}
3、类成员函数显示内联
类外显式定义函数体需要使用inline关键字
/**
*类外定义的函数用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(int argc, char* argv[])
{
Person person;
person.name = "Erin";
person.display();
return 0;
}