仅在优化的Win32 Build(XMMATRIX)中的AccessViolation

时间:2014-06-19 16:08:18

标签: c++ directx directxmath

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

1 个答案:

答案 0 :(得分:1)

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

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

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