C++ Visual Studio-在优化的生成中纠正不同的行为
我正在做一个项目。我最近将它切换到完全优化的发布模式,只是想了解一些事情在调试模式之外的表现。然而,在这样做时,我注意到有一些不规则之处。在我的特殊情况下,我有一个sprite,它的alpha值在发布模式下与调试模式下不同(更透明) 为了检查我的发现,我复制了一份发布模式构建选项,但关闭了优化(确保删除了调试和其他相关的预处理器选项),并且执行正确。优化过程中的某些内容会修改系统的行为。这可能是因为在我的类的某个地方有一些变量我没有初始化 我的问题是,除了手动梳理我的代码外,是否还有其他方法来确保正确初始化?我已经检查了弹出的警告,但是所有警告都与int-to-float/float-to-int转换以及可能丢失的数据和枚举限定符有关,并且没有一个与我的精灵上的alpha相关C++ Visual Studio-在优化的生成中纠正不同的行为,c++,visual-studio,visual-studio-2010,debugging,release,C++,Visual Studio,Visual Studio 2010,Debugging,Release,我正在做一个项目。我最近将它切换到完全优化的发布模式,只是想了解一些事情在调试模式之外的表现。然而,在这样做时,我注意到有一些不规则之处。在我的特殊情况下,我有一个sprite,它的alpha值在发布模式下与调试模式下不同(更透明) 为了检查我的发现,我复制了一份发布模式构建选项,但关闭了优化(确保删除了调试和其他相关的预处理器选项),并且执行正确。优化过程中的某些内容会修改系统的行为。这可能是因为在我的类的某个地方有一些变量我没有初始化 我的问题是,除了手动梳理我的代码外,是否还有其他方法来确
如果Visual Studio 2010有什么不同的话,我会使用它。这种类型的东西可能很难调试。我建议您逐个替换优化,直到找到导致异常的优化。然后,您可以将优化逐一应用于每个翻译单元(文件),从而进一步缩小问题范围
处理此问题的另一种方法本质上是数据跟踪。分析代码以确定控制alpha的数据项。找到写入数据的每条语句。在这些语句上放置断点或跟踪。然后确定可执行文件中发布数据与调试数据不同的第一个点。这类事情可能很难调试。我建议您逐个替换优化,直到找到导致异常的优化。然后,您可以将优化逐一应用于每个翻译单元(文件),从而进一步缩小问题范围
处理此问题的另一种方法本质上是数据跟踪。分析代码以确定控制alpha的数据项。找到写入数据的每条语句。在这些语句上放置断点或跟踪。然后确定可执行文件中发布数据与调试数据不同的第一个点。打开尽可能多的警告以捕获未初始化的变量。通过静态LINT工具运行代码,如cppcheck。我已经有一段时间没有使用VS了,但我很确定您可以设置调试器,在访问未初始化的变量访问时中断,并从那里跟踪它
如果代码是多线程的,则可能存在争用条件,或者编译器可能正在重新排序,如果线程没有交互,通常不会产生任何影响,因此如果是这种情况,请仔细检查锁的正确使用。打开尽可能多的警告以捕获未初始化的变量。通过静态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)) {}
};
始终初始化模板类{
T;
公众:
运算符T&({return T;}
运算符常量T&()常量{return T;}
总是初始化::t(t()){
模板总是初始化(K&&ref):t(std::forward(ref)){
};
为所有成员变量使用始终初始化的模板
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)) {}
};
始终初始化模板类{
T;
公众:
运算符T&({return T;}
运算符常量T&()常量{return T;}
总是初始化::t(t()){
模板总是初始化(K&&ref):t(std::forward(ref)){
};
我们不是神谕-渲染时使用什么?alpha是浮点值还是整数值?你玩弄alpha值的代码是什么样子的?我现在根本不涉及alpha值,这就是为什么我认为它与渲染/图形方面无关,而是与我的类中缺少初始化有关。我正在寻找一种方法来找到缺少初始化的地方我们不是预言家-渲染时使用什么?alpha是浮点值还是整数值?你玩弄alpha值的代码是什么样子的?我现在根本没有触及alpha值,这就是为什么我认为它与渲染/图形方面无关,而是与我的类中缺少初始化有关。我正在寻找一种方法来找到缺少初始化的地方