C++中的内联函数和C的宏关联非常强
首先来回顾C语言中的宏,
编写一些简单的宏函数实际上也是某些公司喜欢考的题
首先我们来写一个ADD两个变量的宏函数:
宏函数的第一点就是 :预处理的时候能不能替换,比如这个ADD函数
上图中替换的时候要能保证原函数的作用不变,最主要的就是运算优先级。
所以正确的写法如下:
#define (a,b) ((a)+(b))
下面总结一下宏
宏的优点:代码的可维护性强、宏函数提高效率,减少了栈帧的建立
宏的缺点:可读性差,没有类型安全检查(上面的参数是没有给类型的),不方便调试(被替换掉了)
接下来说C++中的内联函数:
如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字inline,在调用函数之前需要对函数进行定义。
这里内联函数就是对宏的改进:
- inline int Add(int a int b)
- {
- return a+b;
- }
上面这个是在配置后的debug环境下汇编代码,可以清楚的看到在做加法的时候,没有call指令。
在兼具宏函数优点的情况下,这里其实几乎解决了宏函数的缺点
所以侯捷老师说 尽量使用const、enum、inline去替代#define
最后来介绍一下内联函数的特性:
inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。
inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等,编译器优化时会忽略掉内联。
inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到