AccessViolation仅在优化的Win32构建(XMMATRIX)

AccessViolation only in Optimised Win32 Build (XMMATRIX)

本文关键字:构建 XMMATRIX Win32 优化 AccessViolation      更新时间:2023-10-16

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

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

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

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