内联函数与宏的恩怨情仇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在C++中内联函数主要用于替代宏,因为宏有许多缺点,所以发明了内联函数。

一、为什么要替代宏?

首先宏有许多的缺点:1.不能调试 2.没有类型的安全检查 3.在有些场景下很复杂,容易出错。
例如:写一个两数相加的宏函数。

#define Add(x,y) x+y
#define Add(x,y) (x)+(y)
#define Add(x,y) (x+y)
#define Add(x,y) ((x)+(y))

那么多种写法哪一个才是正确的呢?

#define Add(x,y) x+y

这种写法如果遇到3 * Add(x,y)的话,Add(x,y)会被替换成3 * x+y,显然这不行。

#define Add(x,y) (x)+(y)

这种写法同上也会发生这种问题,但是当x传入的是一个表达式的时候3*Add(x+1,y),会变成
3 *(x+1)+y。

#define Add(x,y) (x+y)

这种写法如果遇到Add(1&1,2&2),会先执行加,再进行位运算。
由上述可知,写宏的时候会遇到很多情况,稍有不慎就会出现问题,因此在C++中推荐使用枚举和const去替代宏常量,使用内联函数去替代宏函数

二、内联函数

内联函数既然要去替代宏,那么就既要解决宏的缺点,又要继承宏的优点,宏的优点很明显就是可以直接替代,并不像函数一样去开辟栈帧,会在程序预处理的时候直接替代。那么内联函数也一样,但它会在编译的时候直接展开。

inline int Add(int x,int y)
{
	return x+y;
}

内联函数首先可以进行类型检查,其次它可以进行调试。
内联函数有一个特点是它的函数声明和定义必须放在一起(同一个文件中),不能像其他函数一样,声明定义分离。

inline int add(int x, int y);//内联函数的声明的定义放一起
inline int add(int x, int y)//内联函数会在编译的时候展开
{
	return x + y;
}

三、特性

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。

这里的空间换时间是因为编译器在编译阶段会将内联函数展开,这就意味着代码量增加,从而使最后的可执行程序文件变大。
内联函数并不是一定会展开,如果内联函数有100行,在程序中使用了100次,那么如果展开就会使程序很大,如果只是去调用的话就会节省很多空间,这个是由编译器自主判断,不同编译器的标准不一致。


总结

在C++中最好使用内联函数去替代宏。
最后祝大家2023年快乐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值