目录标题
为什么会有内联函数
函数在调用的时候会创建函数栈帧,但是栈帧的创建时会消耗性能和资源,而且当函数的内容并不多时,函数栈帧所消耗的性能和资源可能要大于函数内容的本身,尤其是哪种还要大量的调用的小函数,所以我们c语言就给出了一个解决办法就是宏,他可以直接在使用处进行替换而不会调用函数创建栈帧,那么这是c语言提供的方法,c++为了解决上述问题同样提供了一个方法就是内联函数,他的原理跟宏函数差不多也是在调用函数的地方直接进行内容替换而不创建栈帧,那么这里有小伙伴可能会有这样的疑问,既然c语言提供了宏函数,那为什么c++还要提供一个内联函数呢?原因也很简单,因为宏函数他不好用啊!比如说宏函数有下面这三个缺点:
1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查 。
并且宏函数最大的缺点就是太容易写错了比如用宏函数实现一个加法函数:很多人的一开始的写法是下面这样
#define add(x,y) x+y;
这对吗孩子?看起来很对实际上错误一堆比如说我要执行下面这段表达式:add(1,2)*2
我们想要看到的结果肯定是6可是程序跑出来的结果却是5,这是因为宏函数是直接替换表达式会变成下面这样:
1+2*2
所以得到的结果就是5,那么在外层加一个括号能否解决问题呢?比如说下面这样:
#define add(x,y) (x+y);
答案是还是不行,因为参数的传递可能是一个表达式比如说这样:add(1&2,2|3)
,因为不同的操作符的优先级不同所以当参数为表达式时也会出现问题,所以这里的解决方法就是对x和y分别加上括号,比如说下面这样:
#define add(