16字节对齐问题

时间:2013-10-14 18:55:20

标签: c++ directx directx-11 directxmath

我正在使用DirectXMath,在课程中创建XMMatrixXMVector

当我调用XMMatrixMultiply时,它会抛出未处理的异常。

我在网上发现这是字节整数的问题,因为DirectXMath使用SIMD指令集会导致错误的堆分配。

建议的解决方案之一是使用XMFLOAT4X4变量,然后在需要时将它们更改为临时XMMatrix,但它不是最好和最快的解决方案。

另一个是使用_aligned_malloc,但我不知道如何使用它。我从来没有做任何记忆分配,这对我来说是黑魔法。

另一个,是重载new operator,但他们没有提供任何信息如何去做。

关于重载方法,我没有使用new来创建XMMatrix个对象,因为我没有将它们用作指针。

这一切都很好,直到我决定将代码分成几类。

我认为_alligned_malloc解决方案在这里最好,但我不知道如何使用它,何时何地调用它。

2 个答案:

答案 0 :(得分:2)

与可安全存储的XMFLOAT4X4和XMFLOAT4不同,XMMATRIX和XMVECTOR是硬件寄存器(SSE,NEON等)的别名。由于库正在抽象出寄存器类型和对齐要求,因此您不应尝试自己对齐类型,因为您可以轻松地创建一个恰好在您的计算机上运行但在另一个计算机上运行的程序。您应该使用安全类型进行存储(例如XMFLOAT4)或者直接使用向量指令,并在应用程序中为您尝试支持的每个向量扩展添加特殊的存储和对齐代码路径。

此外,在库的矢量指令的上下文之外使用这些寄存器可能会由于其他原因而导致意外故障。例如,如果将XMMATRIX存储在自己的结构中,则某些体系结构可能无法创建结构的副本。

答案 1 :(得分:1)

不要假装是一个完整的答案。

有些方法没有提及:

  • #define _XM_NO_INTRINSICS_。简单。慢。现在可以使用,只需一行代码。 ;)
  • 不要将XMVECTORXMMATRIX存储在堆上。存储XMFLOAT4XMFLOAT4X4并仅在需要时转换为SIMD类型(因此它们将存储在堆栈中)。慢点。许多代码要改变(可能)。
  • 不要将XMVECTORXMMATRIX存储在堆上,第2部分。只需将类存储在堆栈中即可。快速。挺难的。许多代码要改变(可能)。
  • 使用对齐的分配器。快速。硬。谷歌需要花费很多时间,许多代码都要编写和调试。
  • 不要使用DirectXMath(以前的XMMath)库。选择任何其他(有很多)或自己编写。快速。许多代码要改变(可能)。

如果你想要对齐的分配器,它对DirectX或DirectXMath没有任何作用。这是高级话题。没人能给你完整的解决方案。但是,这是谷歌搜索的一些结果:

非常细心。使用错误的内存分配器,您可以引入比解决更多的问题。

希望它有所帮助。快乐的编码! :)