[英]Function parameter passing of type XMVECTOR
为什么 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。
因此,为了确保事物可以在寄存器中传递,它们是“按值”传递的。 为了最小化副本,不太可能在寄存器中结束的东西应该“通过引用”传递。
当然,真正的希望是内联消除了最终优化代码中的调用约定用法,但您不能保证这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.