2011-05-30 66 views
1

我有一个项目正在处理中。我最近将其切换到全面优化的发布模式,以便了解某些东西将如何在调试模式之外执行。但是,在这样做的时候,我注意到有一些违规行为。在我的特殊情况下,我有一个精灵,他们的alpha值在发布模式和调试模式下是不同的(更透明)。Visual Studio - 纠正优化版本中的不同行为

要检查我的发现,我做的释放模式构建选项的副本,但关闭的优化(为确保调试和其他相关的预处理器选项被拆除),并正确执行。优化过程中的某些内容会修改我的系统的行为。这可能是因为有些变量我没有在我的类中初始化。

我的问题是,是否有替代方案,除了在我的代码手动梳理,以确保事情是正确初始化?我检查了弹出的警告,但所有这些都与int浮点/浮点到int转换以及可能丢失数据和枚举限定符有关,并且它们都与我的精灵上的alpha有关。

我使用Visual Studio 2010中,如果它的确与众不同。

+0

我们不是神谕者 - 你用什么来渲染? Alpha是一个浮点数还是整数值?你玩alpha值的代码是怎么样的? – 2011-05-30 20:32:30

+0

我现在没有触及alpha值,这是为什么我认为它与渲染/图形方面没有关系,而是在我的类中缺少初始化。我正在寻找一种方法来查找丢失的初始值设定项是 – Megatron 2011-05-30 20:35:44

回答

3

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

另一种方式来处理这个问题本质上是一种数据跟踪。分析代码以确定哪些数据项正在控制您的alpha。找到写入数据的每条语句。在这些语句中添加断点或痕迹。然后确定释放数据与调试数据不同的第一个可执行文件。

1

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

如果代码是多线程的,那么你可能有一个竞争条件,或者编译器可能重新排序那些在线程没有交互的情况下通常没有什么区别的东西,所以如果是这样的话,请仔细检查你的正确使用锁。

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