在C语言中,我们学习了用#define
定义的宏函数,例如:
#define Add(x, y) ((x) + (y)) //两数相加
相较于函数,我们知道宏替换具有如下比较明显的优点:
但是,对应的C语言的宏替换也有这些致命的缺陷:
注:如果想对C语言的宏有更深的了解,建议看看👉C语言——预处理
而为了解决C语言#define
宏所带来的缺陷,C++有了inline
关键字。
inline
关键字,这个函数就成为了内联函数。例如:
inline void Func()
{
printf("Hello World\n");
}
int main()
{
for (int i = 0; i < 100; i++)
Func();
return 0;
}
上面的代码我们声明了一个内联函数Func
,在编译过后循环处的调用就会变成:
for (int i = 0; i < 100; i++)
printf("Hello World\n"); //内联函数Func直接被展开成了函数体内的内容
以VS2019
为例:
首先,要用反汇编查看内联函数的展开,首先要对编译器做如下设置:
首先,将Debug模式
改为Release模式
然后,右击项目名称,点击属性
接着,配置属性-> C/C++ -> 常规 -> 调试信息格式 ->程序数据库
_inline
设置完成过后,我们就可以通过返汇编查看内联函数的展开了。
我们先来看看没有加入inline
关键字的普通函数:
再来看看加入inline
关键字的内联函数:
既然内联函数可以避免栈帧开销而且安全性也有保证,那是不是可以说以后我们可以将所有的函数都定义成内联函数呢?
当然不可以!!!
首先我们来看一组对比:
所以我们有必要清楚内联函数的局限,知道什么时候可以用,什么时候不可以用;
inline
内联函数实际上是一种空间换时间的做法:通过代码的展开来减少函数调用的开销,但也因此导致了代码膨胀的问题。switch case
语句的函数,一般不用inline
处理如果有人不听劝,将一个递归函数定义成内联函数,会出现什么情况呢?
忽略inline特性
。inline
内联函数是C++专门针对C语言宏函数的缺陷而设计的。