Выравнивание 16 не соблюдается при использовании ключевого слова auto?

Компилируя с VS2012 и работая с библиотекой DirectXMath, я столкнулся с проблемой, когда оказалось, что компилятор не выравнивает мой XMMATRIX. Я упростил вопрос до следующего.

#include <DirectXMath.h>
using namespace DirectX;

int _tmain(int argc, _TCHAR* argv[])
{
auto m1 = XMMatrixIdentity();
auto m2 = XMMatrixIdentity();

auto t1 = XMMatrixTranspose( m1 ); // sometimes access violation occurs here
auto t2 = XMMatrixTranspose( m2 ); // or sometimes here

return 0;
}

Повторный запуск кода снова и снова иногда вызывает «Место чтения нарушения доступа 0xFFFFFFFF» при первом транспонировании, иногда при втором.

Я понял, что это связано с тем, что m1 и m2 неправильно выровнены. Замена «auto» на «XMMATRIX», кажется, решает проблему, поэтому я подозреваю, что это ошибка компилятора, но также возможно, что я делаю что-то не так или не включаю какую-либо опцию.

Что-то не так с моим кодом или это ошибка компилятора?

14

Решение

Определение для XMMATRIX имеет следующее в заголовочном файле (xnamath.h), хотя это может отличаться в вашей версии.

// Matrix type: Sixteen 32 bit floating point components aligned on a
// 16 byte boundary and mapped to four hardware vector registers
#if (defined(_XM_X86_) || defined(_XM_X64_)) && defined(_XM_NO_INTRINSICS_)
typedef struct _XMMATRIX
#else
typedef _DECLSPEC_ALIGN_16_ struct _XMMATRIX
#endif

Так XMMATRIX определяется с __declspec(align(16)) (если вы просматриваете заголовочные файлы, это сводится к этому), что является специфическим расширением Microsoft. Это не макрос. Это означает, что это ошибка компилятора, компилятору не удалось распространить эти проприетарные атрибуты на переменные, определенные с помощью auto ключевое слово.

Вероятно, лучше всего избегать использования auto Ключевое слово в этом случае, это, вероятно, лучше, чем явное добавление declspec сам.

3

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

Это определенно ошибка компилятора. Я тоже могу воспроизвести это на своих уроках математики.
Я открыл билет Вот так что проголосуй за это.
Вы можете избежать использования ключевого слова auto, как уже упоминалось. Или вы можете скомпилировать в x64, где ошибка отсутствует (или, по крайней мере, я не смог ее воспроизвести; моя не очень простая программа работает отлично).

2

Для Visual Studio 2012 я смог реализовать «обходной путь», разделив оператор на две строки:

XMMATRIX mtxMyWorldTrnspd = mtxMyWorld;
mtxMyWorldTrnspd = XMMatrixTranspose(mtxMyWorldTrnspd);
0
По вопросам рекламы [email protected]