2

为什么 FXMVECTOR 的定义在 32 位和 64 位上不同?为什么不应该在 32 位上通过引用传递 XMVECTOR 来使用 SIMD 的荣耀?

先感谢您!

4

1 回答 1

3

Microsoft Docs中详细介绍了各种调用约定宏和类型的详细信息。

简而言之,该库试图在多个平台上支持合理的“最佳”调用约定:

  • 32 位__fastcall,其中前三个 SIMD 值在寄存器中传递。其余的必须通过引用传递,因为堆栈只保证 4 字节对齐。

  • 32 位__vectorcall(需要 VS 2013 或更高版本),其中最多前六个 SIMD 值在寄存器中传递,以及 HVA(即 SIMD 值的矩阵)

  • 64 位__fastcall,它永远不会在寄存器中传递任何 SIMD 值,但堆栈是 16 字节对齐的。

  • 64 位__vectorcall(需要 VS 2013 或更高版本),其中最多前六个 SIMD 值在寄存器中传递,以及 HVA(即 SIMD 值的矩阵)

  • ARM/ARM64 最多可传递寄存器中的前四个 SIMD 值并支持 HVA。

因此,为了确保可以在寄存器中传递事物,它们是“按值”传递的。为了最大限度地减少副本,不太可能出现在寄存器中的东西应该“通过引用”传递。

当然,真正的希望是内联删除最终优化代码中的调用约定使用,但你不能保证这一点。

于 2015-10-05T04:07:02.353 回答