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

Visual Studio - correcting different behaviour in an optimized build

本文关键字:Studio- 优化 构建 Visual      更新时间:2023-10-16

我有一个项目正在进行中。我最近将它切换到了完全优化的发布模式,只是为了了解一些事情在调试模式之外的表现。然而,在这样做的时候,我注意到有一些违规行为。在我的特定情况下,我有一个sprite,它的alpha值在发布模式和调试模式下不同(更透明)。

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

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

如果有什么不同的话,我会使用Visual Studio 2010。

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

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

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

如果代码是多线程的,那么你可能有一个争用条件,或者编译器可能正在重新排序,如果线程不交互,通常不会有什么不同,所以如果是这样的话,请仔细检查你是否正确使用了锁。

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

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)) {}
};