Visual Studio-在优化的构建中纠正不同的行为
Visual Studio - correcting different behaviour in an optimized build
我有一个项目正在进行中。我最近将它切换到了完全优化的发布模式,只是为了了解一些事情在调试模式之外的表现。然而,在这样做的时候,我注意到有一些违规行为。在我的特定情况下,我有一个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)) {}
};
- Visual Studio 调试优化如何工作?
- 向 cppFlags 添加"-O0"无法禁用 Android Studio 中的 clang 编译优化
- 为什么要按值传递string_view?为什么Visual Studio不能优化这一点?
- Visual Studio 优化会破坏 SDL 图形输出
- Visual Studio Profile 引导式优化
- C++ - Xcode "Inline Function Expansion"像Visual Studio中的优化功能一样?
- 通过CMAKE在Visual Studio中设置优化设置
- Visual studio-启用优化会导致崩溃
- Visual Studio仍然可以优化预编译的代码
- Visual Studio 2013优化标志(/O2与/Ox)
- Visual Studio 2013 在存在 /OPT:ICF 的情况下是否进行了正确优化?
- 了解工厂方法和静态变量赋值的返回值优化 (Visual Studio)
- Visual Studio中的条件优化
- Visual Studio 编译器优化,用于 C++ 中的类型转换
- 为什么Visual Studio在这种情况下不执行返回值优化(RVO)
- visual studio是否有任何扩展来优化C++代码单元测试
- Visual Studio 2010-最适合优化的大小或速度
- 如何在使用Visual Studio 编译器使用多重继承时优化对象的内存大小?
- Visual Studio 2015中的返回值优化
- 这是Visual Studio 2013更新4 c++优化器错误还是我的代码错误?