English 中文(简体)
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)) {}
};




相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签