问题描述
|
我有一个正在进行的项目。我最近将其切换到具有完全优化功能的发布模式,目的是了解某些事情将在调试模式下执行的方式。但是,在这样做时,我注意到其中存在一些违规行为。在我的特定情况下,我有一个精灵,在发布模式和调试模式下,其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)) {}
};