【问题标题】:AccessViolation only in Optimised Win32 Build (XMMATRIX)AccessViolation 仅在优化的 Win32 构建 (XMMATRIX) 中
【发布时间】:2014-06-19 16:08:18
【问题描述】:

我在一个函数中设置两个 XMMATRIX** 类型的变量时遇到了一些问题。函数原型如下所示:

bool ViewportFactory::CreateViewport(CanvasHandle* canvasHandlePtr, ViewportHandle** outViewportHandlePtr, DirectX::XMMATRIX** outProjectionMatrix, DirectX::XMMATRIX** outViewMatrix)

然后,稍后在函数定义中,我有以下两行:

*outProjectionMatrix = new DirectX::XMMATRIX(0.0f, 0.1f, /* ... */, 3.3f);
*outViewMatrix = new DirectX::XMMATRIX(0.0f, 0.1f, /* ... */, 3.3f);

但是,在启用了优化的 Win32 构建中,这些行给了我访问冲突。

打开优化后,很难准确推断问题出在哪里,但如果我更改这些行以将值设置为 nullptr,那么问题就会消失。

【问题讨论】:

  • XMMATRIX 构造函数是做什么的?
  • 我不确定,它是 DirectX 的一部分。除非你的意思是我使用它,在这种情况下它只是设置矩阵的 16 个组件(为简洁起见,我删除了巨大的浮点数列表)。
  • 哦,实际上,您可能想看看stackoverflow.com/a/15753540/138772 以及它提到的对齐问题。

标签: c++ directx directxmath


【解决方案1】:

这确实是一个对齐问题。 32位程序中新的DirectX::XMMATRIX只有8字节对齐,XMMATRIX必须是16字节对齐。

您可以使用 __aligned_malloc/__aliged_free 代替 new 或使用 XMFLOAT4X4 类型。或者,不要从堆中分配单个 XMMATRIX 值,而是使用堆栈分配的 XMMATRIX,因为 XMMATRIX 被标记为 __declspec(align(16))。

这在MSDN 上的 DirectXMath 程序员指南中有介绍。这不是一个很长的文档,它包含很多建议。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多