缘起
我在《栈又溢出了》一文中记录了一个奇怪的栈溢出问题。虽然解决了,但是总感觉哪里不太合理。我想,vs 一定有一个合理的设置。一起折腾起来吧!
查找工程设置
本以为能找到某个编译选项对局部变量占用内存的行为进行控制。看遍了工程设置也没发现相关的设置项。release 版会不会有什么不同呢?毕竟,release 版会做一些优化,于是抱着试试看的心态编译了 release 版。您猜怎么着,居然没崩溃!
反汇编
赶紧查看下相关的反汇编,果然和预想的一样,函数局部变量占用的栈空间不再是 debug 版中的 0x12C0DC,而是 0x064008。换算成十进制大概是 409608。
这说明三个局部变量被优化成了一个!release 优化果然给力!但是具体是哪一项优化导致的呢?该怎么排查呢?debug 版和 release 版结果不一样,最简单粗暴的方法就是找不同!
对比设置
把 debug 版的配置保存到 debug.txt,release 版的配置保存到 release.txt。然后用 beyond compare 比较两个文件的内容。
为了让各位小伙伴儿更清晰的对比 debug 和 release 的区别,我特意调整了先后顺序,把不同的选项放到了后面!最重要的不同在最后一行。
debug 版为 /ZI /Gm /Od /RTC1 /MDd,
VS编译优化与栈溢出:深入探究/O2选项

本文通过一个栈溢出问题,探讨了Visual Studio的编译优化选项/O2如何影响局部变量分配,揭示了/O2在优化过程中可能导致的意外行为。作者通过对比debug和release模式,反汇编分析,最终发现/O2选项是关键,并通过在线编译器验证了VS2013可能存在的bug。
最低0.47元/天 解锁文章
1024

被折叠的 条评论
为什么被折叠?



