关于inline与static的总结

日期:2015年4月17日 15:44 星期五 农历 乙未 羊年 二月廿九
修改记录:


正文:
inline与static这两个关键字经常遇见,而且遇见它的人大多都以为自己完全掌握了,其实不尽然。


很早以前就困惑我的一个疑问:inline函数与宏有什么区别呢?它们最终的宿命都是在调用它的地方展开,从最终生成的可执行机器指令来看,它们真的没区别。它们真正的区别在于一下两点:
(1)展开的时机不一样,宏是在预编译的时候就展开了,但是inline函数是在编译的时候展开
(2)展开的方式不一样,宏的展开是纯字符串替换,当宏定义得不严谨且表达式很复杂时,容易出现一些问题,这个大家应该都知道,我就不啰嗦了。inline函数的展开是编译器干得活,这个要比纯字符串替换高大上得多,包括实参与形参的对应,重名字段的处理等等,所以说宏的替换需要程序员保证字符串替换后的正确性,但是inline函数的替换却是编译器帮程序员做了翻译工作,程序员只要保证函数的正确性即可,这就是为什么一般都推荐写inline函数,而不推荐用宏的原因。


另外一个疑问:static函数与inline函数又有什么区别呢?很多人肯定会很疑惑我为什么要问这个问题,因为它们两个看起来毫不相关。问题的起因是这样的,因定位问题需要,我有时会研究一下反汇编的代码,但是发现无论是inline函数还是static函数在符号表中都找不到它们的入口,在反汇编代码中,它们两者呈现出了完全相同的效果,那就是直接在调用点展开了。inline函数会在调用点展开这一点大家都清楚,但是static函数为什么也会被展开呢?经过一番查证,最终得知,static函数在普通的情况下它是不会被展开的,它只是在编译链接的时候被限制了作用域只能在本文件,在执行的时候它与普通的函数并没有任何区别。不信的话可以用函数指针试试,用函数指针的方式可以在另外一个文件中调用static函数,或者static变量。但是编译时一旦开启了O2或者O3优化的时候,编译器为了提高运行效率,会选择把static函数像inline函数一样在调用点展开,这就是为什么反汇编的符号表中找不到static函数入口的原因了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值