使用auto关键字时,对齐16不受尊重?

时间:2012-09-04 00:10:36

标签: c++ visual-c++ visual-studio-2012 memory-alignment directxmath

使用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没有正确对齐。用“XMMATRIX”替换“auto”似乎解决了这个问题,所以我的怀疑是一个编译器错误,但它也可能是我做错了,或者没有启用某些选项。

我的代码有问题或者这是编译器错误吗?

3 个答案:

答案 0 :(得分:3)

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更简洁。

答案 1 :(得分:2)

这绝对是一个编译错误。我也可以用自己的数学课程重现它。 我开了一张票here,所以投了票。 如上所述,您可以避免使用auto关键字。或者你可以编译到没有错误的x64(或者至少我无法重现它;我不那么简单的程序可以很好地工作)。

答案 2 :(得分:0)

对于Visual Studio 2012,我能够实现&#34;解决方案&#34;它通过将语句拆分为两行:

XMMATRIX mtxMyWorldTrnspd = mtxMyWorld;
mtxMyWorldTrnspd = XMMatrixTranspose(mtxMyWorldTrnspd);
相关问题