使用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"似乎解决了这个问题,所以我的怀疑是一个编译器错误,但它也可能是我做错了,或者没有启用某些选项.
我的代码有问题还是编译错误?
c++ memory-alignment visual-c++ visual-studio-2012 directxmath
我正在阅读关于DirectXMath的文档,并偶然发现了下一篇文章:
作为通过重载new/delete直接在C++类中强制执行对齐的替代方法,您可以使用pImpl惯用法.如果确保您的Impl类在内部通过__aligned_malloc对齐,则可以在内部实现中自由使用对齐的类型.当'public'类是Windows运行时ref类或打算与std :: shared_ptr <>一起使用时,这是一个很好的选择,否则会破坏仔细对齐.
我不明白shared_ptr如何在对齐策略中做任何改变,它只有一个指针,它不会分配一个对象.
我以前做过OpenGL,现在正在学习一些DirectX11.新数学库中的一件事是向量和矩阵存在加载/存储方法(例如http://msdn.microsoft.com/en-us/library/ee415635(v=vs.85).aspx).
对我来说,当我想使用它们时,我需要存储/加载每个向量和矩阵,这让我很烦恼 - 很多庞大的代码 - 我想知道是否有任何漂亮,干净的替代加载/存储过程?
我一直在尝试使用XMVECTOR作为边界框的类成员,因为我做了很多计算,但是每帧只使用一次XMFLOAT3,所以边界框有一个方法让我在XMFLOAT3中居中,否则它保留在XMVECTOR中;该类用__declspec(align(16))进行处理,并在调试模式下工作.但是在Release模式下,它崩溃了我设置的东西:
Box& Box::operator=(const Box& box)
{
_center = box._center;
_extents = box._extents;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
每当我这样做:
Box A;
Box B;
A = B;
Run Code Online (Sandbox Code Playgroud)
它崩溃,给我0xC0000005:访问冲突读取位置0x00000000.当我将其创建为指针时,它也会崩溃:
Box* A = new Box();
Run Code Online (Sandbox Code Playgroud)
这是构造函数:
Box::Box()
{
center = XMVectorZero();
extents = XMVectorSplatOne();
}
Run Code Online (Sandbox Code Playgroud)
再次,这在调试模式下工作正常,但在Release中它崩溃了.什么样的Release模式可以改变,会产生无效的代码?除了将盒子对齐到16个字节之外,我还需要做其他事情吗?
好吧我正在开发我自己的DirectX框架所有关于制作DirectX框架的教程都是旧的并且使用已弃用的东西,所以我只是制作了自己的东西,虽然我从旧教程中获取了一些东西并更新它们以使用新的Windows 8.1 SDK和这里来了问题,我得到XMMATRIX原始代码使用的错误D3DXMATRIX
(33): error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned
(40): error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'worldMatrix': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'viewMatrix': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'projectionMatrix': formal parameter with __declspec(align('16')) won't be aligned
Run Code Online (Sandbox Code Playgroud)
这是S_SHADER.h的第33行:
bool Render(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX);
Run Code Online (Sandbox Code Playgroud)
这是S_SHADER.h的第40行:
bool SetSHaderParameters(ID3D11DeviceContext*, XMMATRIX, XMMATRIX, XMMATRIX);
Run Code Online (Sandbox Code Playgroud)
这是S_SHADER.cpp的第42行:
41 - bool S_SHADER::Render(ID3D11DeviceContext* deviceContext, …Run Code Online (Sandbox Code Playgroud) c++ ×5
directxmath ×5
directx ×2
directx-11 ×2
c++11 ×1
release-mode ×1
shared-ptr ×1
simd ×1
stl ×1
visual-c++ ×1