为什么C4738没有双重警告?

sha*_*oth 7 c++ floating-point compiler-warnings visual-c++

Visual C++可以发出C4738警告:

将32位浮点数存储在内存中,可能会导致性能下降

对于32位float即将存储在存储器中而不是存储在寄存器中的情况.

该描述进一步说明使用double解决问题.我不明白为什么后者是真的.

为什么存储float在内存中会导致性能下降而存储double不会?

Mic*_*rdt 8

该警告结合了两个问题:

  • 浮点数需要存储在内存而不是寄存器中,这会降低性能(因为内存比寄存器慢得多)
  • 浮点数将被舍入(因为寄存器总是有64或80位,但在内存中浮点数只有32位).

使用双重解析第二个问题(至少部分地,64位仍然不如80位精确),但对可能的性能损失没有影响.这就是为什么警告描述提到了两种补救办法:

要解决此警告并避免舍入,请使用/ fp:fast编译或使用双精度而不是浮点数.

要解决此警告并避免耗尽寄存器,请更改计算顺序并修改对内联的使用

  • @tenfour:当你在32位内存位置存储一个64位浮点寄存器时,你必须进行舍入,并且舍入需要时间.将64位浮点寄存器存入64位存储器位置时,无需进行舍入,只需存储即可.(大多数浮点数现在都是SSE寄存器,所以80位的东西是不相关的.) (2认同)