现在的位置: 首页 > 综合 > 正文

C++ Debug 和 Release 运行结果不同

2018年10月28日 ⁄ 综合 ⁄ 共 1114字 ⁄ 字号 评论关闭

VS2008 Debug 和 Release 版本程序运行结果不同的可能原因小结

问题:VS2008下,Debug 和 Release模式下均可正常运行的程序,但两者的结果却不同。 现总结可能原因如下:

1. 注意OpenMP等并行化算法在 Debug 和 Release下可能存在的区别;

2. 注意 float,double型数据强制转换为 int 型,或与int型,或int 型间做除法等运算时产生的数据丢失、偏差;

3. 变量未默认初始化。Debug 和 Release对于没有人为初始化的变量的处理是存在区别的,因而会导致后续错误;

4. 程序涉及图像数据生成、操作的,例如用opencv在程序中动态生成IplImage型图像数据,要保证图像的宽最好为4的倍数(具体原因参看相关图像格式的内容),否则Debug 和 Release各自在处理每行多余或补充的像素时,会以不同的数值初始化,因而导致后续使用时,图像数据本身存在了差别;

5. Debug 和 Release本身存在的编译、代码优化的差异,会使其对数据,尤其是浮点数据,的运算结果有轻微的偏差。例如不同模式下,会对运算表达式的先后顺序作优化调整,这会导致可能存在的数据运算结果的细微不同。通常,这种偏差不会很大,而且出现较为随机。如果结果偏差很大,那么就不是本条原因所对应的问题。具体原因及可行的优化方法在如下几个链接中:

http://stackoverflow.com/questions/141752/float-values-behaving-differently-across-the-release-and-debug-builds

http://ofekshilon.com/2009/08/28/debugrelease-numerical-differences/

http://msdn.microsoft.com/en-us/library/aa289157%28VS.71%29.aspx

http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx?ppud=4

6. 在读取外部文件时,Debug 和 Release 模式对程序中出现的相对路径的处理方式是不同的,所以有时会出现Debug能运行,但Release不能运行的情况。具体可参看 http://our2848884.blog.163.com/blog/static/146854834201082104634307/。而为避免相对路径引用出问题,可自适应地获取当前工作路径,获取方法可参考 http://blog.csdn.net/lincyang/article/details/6240008


抱歉!评论已关闭.