为什么 FXMVECTOR 的定义在 32 位和 64 位上不同?为什么不应该在 32 位上通过引用传递 XMVECTOR 来使用 SIMD 的荣耀?
先感谢您!
为什么 FXMVECTOR 的定义在 32 位和 64 位上不同?为什么不应该在 32 位上通过引用传递 XMVECTOR 来使用 SIMD 的荣耀?
先感谢您!
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。
因此,为了确保可以在寄存器中传递事物,它们是“按值”传递的。为了最大限度地减少副本,不太可能出现在寄存器中的东西应该“通过引用”传递。
当然,真正的希望是内联删除最终优化代码中的调用约定使用,但你不能保证这一点。