今天在运行release
工程时发现运行结果出现了-1.#IND00, 1.#INF00
。但是在debug
下可以计算出数字。于是在网上查找资料。
- 尝试修改配置属性优化方法为已禁用。未果
- 尝试修改调试信息格式。未果
- 尝试修改代码生成运行库。未果
原因: 最后通过输出变量仔细对比发现是某个函数中的输入参数是一个结构体,而结构体内包含了多个数组,其中有些数组没有被我进行初始化导致的计算错误。
分析: 由于debug
模式下保留调试信息并通常自动将结构体内未初始化的变量初始化为0,所以在debug
模式下未完全初始化一个结构体通常并不会引起计算问题,除非本来不想让它为0
,但忘了初始化才会计算错误,恰巧想让它为0
但忘了初始化在某些情况下不会报错。
但是release
模式进行了内部的代码优化,使速度最大化,这其中并不会自动初始化结构体内数组。当使用它的时候会变成一个巨大的数,最终导致计算错误,但是编译的时候也不会报错。
结论: 这种情况90%
是由于输入的参数包含的某些数组未初始化导致,9.99%
是调用的库的配置属性(优化策略、运行库、调试信息格式)不一致导致,0.01%
是编译器出了问题,换一个编译器可能可以解决,概率很小。应当优先考虑上述两情况。