概述
日期: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函数入口的原因了。
最后
以上就是勤奋绿草为你收集整理的关于inline与static的总结的全部内容,希望文章能够帮你解决关于inline与static的总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复