C++之内联函数详解
内联函数的概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。
为什么有内联函数?
在详细的讲解内联函数之前我们要思考一下为什么会存在内联函数?下面我们以快排算法为例,为大家讲解一下为什么要存在内联函数。
不了解快排的也不需要担心,我们只需要知道在快排中,我们需要频繁的调用swap函数
当我们要使用快排(qsort)时,我们要调用swap函数,而调用函数是需要建立栈帧的!所以数据量一大!我们就要不断的建立栈帧!而频繁建立栈帧这件事本身也是有性能消耗的!
所以为了进一步的优化性能我们该结局和这个问题呢?
在c语言中,我们可以使用宏函数或者直接写在qsort函数里面!
直接写在里面就不需要调用函数建立栈帧!但是直接写在里面就失去了复用性!
所以为了具有更高的复用性使用宏函数是更好的选择!
因为宏函数的本质是替换,会在预编译阶段就进行替换也相当于直接写在里面!
但是宏函数本身也是有很多缺点的!
- 不能调试!这就是一件非常麻烦的事情,也就是一旦出错我们可能要花很长时间才能发现问题在哪!
- 没有类型安全的检查
- 宏函数很容易写错!
对于大多数人来说宏函数其实是很少使用的!所以写错也就变得很平常了
下面我举例几个常见的宏的经典错误
#define ADD(x,y) x+y//如果怎么写 ADD(1,2) *3; 1+2*3;//在预编译阶段!就会这样子! #define ADD(x,y) (x+y)//那怎么写呢? ADD(a|b ,a&b); a|b + a&b;//先不说代码是否可以正确执行,光是用来逻辑判断优先级也是件很麻烦的事情! //或者换成另一个直观点的例子 #define MUL(x,y) (x*y) MUL(a+b,b+c); a+b*b+c;//预编译阶段的结果! #define ADD(x,y) ((x)+(y))//这样子经过了多次完善才终于得到了一个正确的宏函数 //但是!有的人总会在这里画蛇添足 #define ADD(x