【问题标题】:16 byte alignment issue16字节对齐问题
【发布时间】:2013-10-14 18:55:20
【问题描述】:

我正在使用DirectXMath,在类中创建XMMatrixXMVector

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

我在网上发现这是字节对齐的问题,因为DirectXMath 使用SIMD 指令集导致未对齐的堆分配。

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

另一个是使用_aligned_malloc,但我不知道如何使用它。我从来不需要做任何内存分配,这对我来说是黑魔法。

另一个,是超载new operator,但他们没有提供任何信息如何做到这一点。

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

在我决定将代码拆分为类之前,一切都很好。

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

【问题讨论】:

    标签: c++ directx directx-11 directxmath


    【解决方案1】:

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

    此外,在库的向量指令上下文之外使用这些寄存器可能会由于其他原因导致意外失败。例如,如果您将 XMMATRIX 存储在自己的结构中,某些架构可能无法创建该结构的副本。

    【讨论】:

      【解决方案2】:

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

      有些方法你没有提到:

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

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

      要非常专心。使用糟糕的内存分配器,您可能会引入比解决方案更多的问题。

      希望它以某种方式有所帮助。快乐编码! :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-08
        • 2010-11-30
        • 1970-01-01
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        相关资源
        最近更新 更多