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'.
当然,真正的希望是内联删除最终优化代码中的调用约定用法,但您不能保证这一点。
为什么 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'.
当然,真正的希望是内联删除最终优化代码中的调用约定用法,但您不能保证这一点。