AccessViolation только в оптимизированной сборке Win32 (XMMATRIX)

У меня возникли проблемы с установкой двух переменных типа 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, то проблема уходит.

0

Решение

Это действительно проблема выравнивания. новый DirectX :: XMMATRIX в 32-битной программе выровнен только на 8 байтов, а XMMATRIX должен быть выровнен на 16 байтов.

Вы можете либо использовать __aligned_malloc / __ aliged_free вместо new, либо использовать тип XMFLOAT4X4. Или вместо того, чтобы выделять отдельные значения XMMATRIX из кучи, используйте вместо этого выделенный в стеке XMMATRIX, который будет правильно выровнен, поскольку XMMATRIX помечен как __declspec (align (16)).

Это описано в Руководстве по программированию DirectXMath на MSDN. Это не длинный документ, и он содержит много советов.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector