目录
内联函数的概念
概念:经过inline修饰的函数,编译器在使用这个函数的时候会自动将这个函数展开,所以没有了函数创立栈帧的开销,提高了程序的运行效率
inline int Add(int x, int y) //内联函数的样例
{
return x + y;
}
内联函数和宏定义的比较
#include<iostream>
using namespace std;
#define ADD(a,b) ((a)+(b)) //宏定义
inline int Add(int x, int y) //内联函数
{
return x + y;
}
int main()
{
int a = 0;
int b = 0;
Add(a, b);
ADD(a, b);
return 0;
}
我们先来介绍一下宏定义
宏定义在预处理阶段就会被展开
所以存在一些问题
1、不支持调试
因为宏定义在预处理阶段就被展开了,而调试是在编译阶段
2、语法复杂
为了防止宏定义出错,我们往往写的很复杂
比如:
#define ADD(a,b) ((a)+(b)) //用了多个括号围着
如果没有这些括号
#define ADD(a,b) a+b
int main()
{
int a = 1;
int b = 2;
int c = 3;
c* ADD(a, b); //将会变成3*1+2
return 0;
}
3、没有类型安全的检查
宏可以对任意类型的变量进行预处理,所以存在不安全性
#define ADD(a,b) ((a)+(b))
int main()
{
int a = 1;
int b = 2;
double c = 0;
double d = 0;
ADD(a, b); //对整型进行替换
ADD(c, d); //对浮点型进行替换
return 0;
}
而内联函数没有这些问题,但是它也有自己的问题
内联函数的优点与不足
优点:
没有宏定义那种缺陷
缺点:
1、内联函数只适用于比较小的函数,因为假如函数很大,那么被展开的时候将会很大程度上占用空间
2、 inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到
3、编译器有可能会自动忽略掉函数体很大,或者带有递归的内联函数
4、内联需要在定义时候使用inline,声明时候时候inline没有效果
类与内联
1、在类内定义的函数都是内联函数,不管是否有inline修饰
2、函数声明在类内,定义在类外,需要在类外的函数返回值前面使用inline