函数参数传递类型XMVECTOR

时间:2015-10-03 13:52:17

标签: c++ xna-math-library

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

提前谢谢!

1 个答案:

答案 0 :(得分:3)

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

简而言之,图书馆正试图合理地支持“最佳”。在多个平台上调用约定:

  • 32位__fastcall,其中前三个SIMD值在寄存器中传递。其余的必须通过引用传递,因为堆栈只保证4字节对齐。

  • 32位__vectorcall(需要VS 2013或更高版本),其中最多六个SIMD值在寄存器中传递,以及HVAs(即SIMD值的矩阵)

    < / LI>
  • 64位__fastcall,它永远不会传递寄存器中的任何SIMD值,但堆栈是16字节对齐的。

  • 64位__vectorcall(需要VS 2013或更高版本),其中前六个SIMD值在寄存器中传递,以及HVAs(即SIMD值的矩阵)

    < / LI>
  • 32位ARM,它将在寄存器中传递前四个SIMD值并支持HVA。

因此,为了确保可以在寄存器中传递内容,它们会通过值&#39;传递。为了尽量减少副本,不应该通过引用来传递不可能在注册表中结束的内容。

当然,真正的希望是内联会删除最终优化代码中的调用约定用法,但是你无法保证。