c++ - 使用 auto 关键字时不遵守对齐 16?

标签 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”似乎可以解决问题,所以我怀疑是编译器错误,但也可能是我做错了什么,或者没有启用某些选项。

我的代码有问题还是编译器错误?

最佳答案

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

关于c++ - 使用 auto 关键字时不遵守对齐 16?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12255297/

相关文章:

C++:指针与指针的指针在二叉树中插入节点

github - Visual Studio 2012 - 导入/导出 GitHub 要点

visual-studio-2012 - 重启VS后RDL文件不显示

c++ - 仅读取共享内存时的互斥锁定

c++ - 打印字符数组 C++

c++ - 将不同的对象传递给一个函数

c++ - 我想学习Visual C++游戏开发?

c++ - foo({0, 0}) : Is this using initializer lists?

c - 多行字符串初始化

c - 在范围内写入数组值时发生访问冲突