XMVECTOR 类型的函数参数传递

Function parameter passing of type XMVECTOR

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

提前致谢!

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

简而言之,该库正试图合理地支持 'optimal' 跨多个平台的调用约定:

  • 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。

所以为了确保事物可以在寄存器中传递,它们被传递 'by value'。为了尽量减少副本,不太可能在寄存器中结束的东西应该被传递 'by reference'.

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