0

我在一个函数中设置两个 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,那么问题就会消失。

4

1 回答 1

1

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

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

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

于 2014-07-08T19:15:03.327 回答