为什么FXMVECTOR的定义在32位和64位上有所不同? 为什么不能通过32位引用传递XMVECTOR来使用SIMD的荣耀?
提前谢谢!
答案 0 :(得分:3)
MSDN详细介绍了各种调用约定宏和类型的详细信息。
简而言之,图书馆正试图合理地支持“最佳”。在多个平台上调用约定:
32位__fastcall
,其中前三个SIMD值在寄存器中传递。其余的必须通过引用传递,因为堆栈只保证4字节对齐。
32位__vectorcall
(需要VS 2013或更高版本),其中最多六个SIMD值在寄存器中传递,以及HVAs(即SIMD值的矩阵)
64位__fastcall
,它永远不会传递寄存器中的任何SIMD值,但堆栈是16字节对齐的。
64位__vectorcall
(需要VS 2013或更高版本),其中前六个SIMD值在寄存器中传递,以及HVAs(即SIMD值的矩阵)
32位ARM,它将在寄存器中传递前四个SIMD值并支持HVA。
因此,为了确保可以在寄存器中传递内容,它们会通过值'传递。为了尽量减少副本,不应该通过引用来传递不可能在注册表中结束的内容。
当然,真正的希望是内联会删除最终优化代码中的调用约定用法,但是你无法保证。