Visual Studio - 纠正优化构建中的不同行为

时间:2011-05-30 20:28:24

标签: c++ visual-studio visual-studio-2010 debugging release

我有一个我正在研究的项目。我最近将其切换到完全优化的发布模式,只是为了了解一些事情将如何执行调试模式。然而,在这样做时,我注意到有一些违规行为。在我的特殊情况下,我有一个精灵,他的alpha值在发布模式和调试模式下是不同的(更透明)。

为了检查我的发现,我制作了发布模式构建选项的副本,但关闭了优化(确保删除了DEBUG和其他相关的预处理器选项)并且它正确执行。优化过程中的某些内容会修改我的系统的行为。这可能是因为有些变量我没有在我的课程中初始化。

我的问题是,除了手动梳理我的代码之外,还有其他方法可以确保正确初始化内容吗?我已经检查了弹出的警告,但是所有这些都与int相关,浮动/浮动到int转换以及可能丢失的数据和枚举限定符,并且它们都没有与我的精灵上的alpha相关。

如果它有所作为,我正在使用Visual Studio 2010。

3 个答案:

答案 0 :(得分:3)

这种类型的东西可能很难调试。我建议您逐个替换优化,直到找到导致异常的优化。然后,您可以通过逐个将优化应用于每个翻译单元(文件)来进一步缩小问题范围。

处理此问题的另一种方法实质上是数据跟踪。分析代码以确定哪些数据项控制着您的alpha。找到写入数据的每个语句。在这些语句上放置断点或跟踪。然后确定可执行文件中发布数据与调试数据不同的第一个点。

答案 1 :(得分:1)

尽可能多地启用警告以捕获未初始化的变量。通过静态LINT工具运行代码,如cppcheck。自从我使用VS以来已经有一段时间了,但我很确定你可以设置你的调试器来打破访问未初始化的变量访问并从那里跟踪它。

如果代码是多线程的,那么你可能有一个竞争条件,或者编译器可能正在重新排序那些在线程没有交互时通常不会产生影响的事情,所以如果是这种情况,请仔细检查你的使用锁。

答案 2 :(得分:0)

为所有成员变量使用始终初始化的模板。

template<typename T> class always_initialized {
    T t;
public:
    operator T&() { return t; }
    operator const T&() const { return t; }
    always_initialized() : t(T()) {}
    template<typename K> always_initialized(K&& ref) : t(std::forward<K>(ref)) {}
};