Mer*_*OWA 14 c++ memory-alignment visual-c++ visual-studio-2012 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;
}
Run Code Online (Sandbox Code Playgroud)
反复重新运行代码有时会在第一次转置时导致"访问冲突读取位置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
Run Code Online (Sandbox Code Playgroud)
SoXMMATRIX的定义是__declspec(align(16))(如果你查看头文件,它确实会简化为这样),这是 Microsoft 特定的扩展。这不是宏。这意味着这是一个编译器错误,编译器无法将这些专有属性传播到使用关键字定义的变量auto。
在这种情况下,最好避免使用关键字auto,它可能比显式添加declspec您自己更简洁。
| 归档时间: |
|
| 查看次数: |
1130 次 |
| 最近记录: |