内联函数方面遇到的问题
2010-06-01 17:44
253 查看
现象:在一个项目中我们的程序在Debug下,运行良好,但在Release版本下程序退出时出现错误,代码跟踪程序已经执行完毕,但在一行汇编代码中排抛出异常
原因:经多方努力查找,发现是一处静态内联函数导致(与静态无关),因为Debug下默认的对内联函数采取的是Disable*设置,但在release下,根据优化选项不同对内联函数采取的策略也不相同,例如:Maximize下,对内联函数的设置为only _inline(我们项目中就是选的这个),若一个函数被声明成内联函数,编译器即使遇到该函数的声明也不会为该函数编译出一个对象,因为内联函数是在用到的地方展开的。可是若在调用该内联函数的地方发现该内联函数的不适合展开时怎么办?一种选择是在调用该内联函数的目标文件中为该内联函数编译一个对象。这么做的直接后果是:若在多个文件调用了内联失败的函数,其中每个文件对应的目标文件中都会包含一份该内联函数的目标代码。
如果编译器真的选择了上面的做法对待内联失败的函数,那么最好的情况是:没吃到羊肉,反惹了一身骚。即内联的好处没享受到,缺点却承担了:目标代码的体积膨胀得与成功内联的目标代码一样,但目标代码的效率确和没内联一样。
更糟的是由于存在多份函数目标代码带来一些程序臭虫。最明显的例子是:内联失败的函数内的静态变量实际上就不在只有一份,而是有若干份。这显然是个错误,但是如果不了解内幕就很难找到原因。
改正方法1:把内联函数改为普通函数
改正方法2:把内联函数设置设为Disable*(省事但不提倡)
原因:经多方努力查找,发现是一处静态内联函数导致(与静态无关),因为Debug下默认的对内联函数采取的是Disable*设置,但在release下,根据优化选项不同对内联函数采取的策略也不相同,例如:Maximize下,对内联函数的设置为only _inline(我们项目中就是选的这个),若一个函数被声明成内联函数,编译器即使遇到该函数的声明也不会为该函数编译出一个对象,因为内联函数是在用到的地方展开的。可是若在调用该内联函数的地方发现该内联函数的不适合展开时怎么办?一种选择是在调用该内联函数的目标文件中为该内联函数编译一个对象。这么做的直接后果是:若在多个文件调用了内联失败的函数,其中每个文件对应的目标文件中都会包含一份该内联函数的目标代码。
如果编译器真的选择了上面的做法对待内联失败的函数,那么最好的情况是:没吃到羊肉,反惹了一身骚。即内联的好处没享受到,缺点却承担了:目标代码的体积膨胀得与成功内联的目标代码一样,但目标代码的效率确和没内联一样。
更糟的是由于存在多份函数目标代码带来一些程序臭虫。最明显的例子是:内联失败的函数内的静态变量实际上就不在只有一份,而是有若干份。这显然是个错误,但是如果不了解内幕就很难找到原因。
改正方法1:把内联函数改为普通函数
改正方法2:把内联函数设置设为Disable*(省事但不提倡)
相关文章推荐
- 升级Win10 Build 10525激活方面遇到的一些问题解答汇总
- 智能家居服务器和zigbee方面遇到的问题
- 使用CefSharp遇到的问题(配置方面)。
- 项目中遇到的零散问题(.NET方面)
- 初次接触svm遇到的软件方面的问题
- 【ffmpeg-0.11.1移植到windows】【网络方面遇到的问题】【中文设备名问题】
- 遗传规划方面的高手帮忙!几个java编程遇到的问题!
- 在学习C语言时遇到的一些细节方面的问题
- 内联函数遇到的问题
- webview的简单总结(最近面试遇到好多这方面的问题)
- 升级Win10 Build 10525激活方面遇到的一些问题解答汇总
- 在协调景城网市场部方面工作中遇到的一些问题问题
- 【orange】OrangeS一个操作系统的实现:第四章实践方面遇到的一些问题
- 今天分公司的人遇到监听方面的问题,从网上搜索方法解决了备注一下
- MFC 通信方面遇到的问题
- 系统遇到的音频方面的问题
- 项目中遇到的零散问题(Sqlserver方面)
- hibernate 实体注解在主键生成策略方面遇到的问题
- HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。本文对两者从来源、特性、算法等多个方面进行对比总结。力争多角度、全方位的展示二者的不同,做到此问题的终结版。
- 项目过程中遇到的关于数据库和内存方面的性能问题