您的位置:首页 > 其它

内联函数方面遇到的问题

2010-06-01 17:44 253 查看
现象:在一个项目中我们的程序在Debug下,运行良好,但在Release版本下程序退出时出现错误,代码跟踪程序已经执行完毕,但在一行汇编代码中排抛出异常

原因:经多方努力查找,发现是一处静态内联函数导致(与静态无关),因为Debug下默认的对内联函数采取的是Disable*设置,但在release下,根据优化选项不同对内联函数采取的策略也不相同,例如:Maximize下,对内联函数的设置为only _inline(我们项目中就是选的这个),若一个函数被声明成内联函数,编译器即使遇到该函数的声明也不会为该函数编译出一个对象,因为内联函数是在用到的地方展开的。可是若在调用该内联函数的地方发现该内联函数的不适合展开时怎么办?一种选择是在调用该内联函数的目标文件中为该内联函数编译一个对象。这么做的直接后果是:若在多个文件调用了内联失败的函数,其中每个文件对应的目标文件中都会包含一份该内联函数的目标代码。

如果编译器真的选择了上面的做法对待内联失败的函数,那么最好的情况是:没吃到羊肉,反惹了一身骚。即内联的好处没享受到,缺点却承担了:目标代码的体积膨胀得与成功内联的目标代码一样,但目标代码的效率确和没内联一样。

更糟的是由于存在多份函数目标代码带来一些程序臭虫。最明显的例子是:内联失败的函数内的静态变量实际上就不在只有一份,而是有若干份。这显然是个错误,但是如果不了解内幕就很难找到原因。

改正方法1:把内联函数改为普通函数

改正方法2:把内联函数设置设为Disable*(省事但不提倡)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐