宏和内联函数的小结

内联函数和宏
宏定义是C语言提出的,它在预处理的地方将代码展开,这样做,相比于函数调用,可减少额外的时间和空间开销。
但是宏定义有一些缺点,最明显的是,它容易产生二义性。如:#define MAX(a, b) a>b?a:b
使用该宏: MAX( num1, num2 ,因为宏展开后变成
num1>num2 ?num1:num2,但是,如果是这样调用的:MAX( 17+32, 25+21),编译时出现错误,原因是,宏展开后变成: 17+32>25+21?17+32:25+21(shit!!!)
所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。

define MAX( (a), (b) ) (a)>(b)?(a):(b)

即使是这样,这个宏仍有Bug,因为如果我这样调用 MAX(i++,j++),经过这个宏以后,(自己试了下,只有i和j中大的那个被累加了两次)
为了克服C语言宏的断言,C++提提出了内联函数。内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。 而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销,而且,内联函数会进行参数类型检查,更加安全
总结:
相同点:(1) 两者都会对定义进行展开,以减少函数调用带来的开销; (2) 两者均适合代码量较小的函数,如果代码量过大,宏展开会占用大量内存,会降低程序执行速度;而对于内联函数,编译器可能会将之视为非内联函数使用。
不同点:宏是由预处理器对宏进行文本替换,而内联函数通过编译器进行替换,且它是真正的函数,会对参数类型进行检查,更加安全。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值