VS 中的优化设置
Posted
技术标签:
【中文标题】VS 中的优化设置【英文标题】:Optimization settings in VS 【发布时间】:2009-04-30 10:24:29 【问题描述】:我正在开发一个使用 Win32/ATL 创建的应用程序/GUI。 所以有 UI 字段(文本字段)可以正常工作,如调试构建中设计的那样。在发布版本中,它会出现格式错误,并且看起来文本字段的宽度是无限的。 它在调试版本中运行良好,但在发布版本中创建问题。 所以我的问题是相同的代码如何在调试版本中工作而不在发布版本中工作。 是否有可能与发布版本中的优化设置有关? 在发布版本中,我们将优化设置设置为最小大小,支持小代码。 此外,当我尝试调试发布版本时,它再次正常工作。发布版本中的调试会消除优化吗?
我想在发布版本中进行调试时重现该问题,或者如果可能在调试版本中重现该问题。 有什么建议吗?
【问题讨论】:
好的,我在 debug build 中启用了 /RTC 选项。但我的调试版本运行良好。根据我的理解 /RTC 选项应该将未初始化的变量设置为 0xCC,因此程序应该崩溃或显示奇怪的结果。 有没有其他方法可以让我的调试版本在发布版本中表现得像它的行为?或者有什么方法可以调试我的发布版本来解决这个问题。 【参考方案1】:VC++ 在调试模式下用特殊值填充其运行时内存。但它不确保任何固定或零初始化。有关详细信息,请阅读此 SO 线程。 Uninitialized Memory Blocks。这些值可能不会每次都使应用程序崩溃。
我曾经遇到过类似的情况。一个常见的例子是越过数组边界访问是一个错误。很多时候,这在调试模式下并不明显,但在发布版本中崩溃了。一般来说,运行时在调试模式下是宽松的,并为程序员错误提供了更多的掩护。
正如其他人指出的那样,代码肯定存在一些问题;很可能是未初始化的变量。
【讨论】:
【参考方案2】:尝试使用 s 选项启用/RTC (Run-Time Error Checks 编译器标志。这会将局部变量初始化为非零值,这有助于诊断未初始化的变量。
【讨论】:
【参考方案3】:我不以为然:确保您使用的 ASSERT
s 不包含任何逻辑,因为这些在发布版本中被丢弃。
【讨论】:
【参考方案4】:这与优化无关。在调试版本中,编译器通常会将变量初始化为已知值,而在发布版本中则不会。您描述的症状可能是由于代码中未初始化的变量或指针。
【讨论】:
初始化知道值是什么意思?就像我有一个变量 int i;所以在调试构建中我会被初始化为0?有什么办法可以覆盖这个设置?以上是关于VS 中的优化设置的主要内容,如果未能解决你的问题,请参考以下文章