标签: directxmath

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

使用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

14
推荐指数
1
解决办法
1130
查看次数

shared_ptr如何破坏对齐

我正在阅读关于DirectXMath的文档,并偶然发现了下一篇文章:

作为通过重载new/delete直接在C++类中强制执行对齐的替代方法,您可以使用pImpl惯用法.如果确保您的Impl类在内部通过__aligned_malloc对齐,则可以在内部实现中自由使用对齐的类型.当'public'类是Windows运行时ref类或打算与std :: shared_ptr <>一起使用时,这是一个很好的选择,否则会破坏仔细对齐.

我不明白shared_ptr如何在对齐策略中做任何改变,它只有一个指针,它不会分配一个对象.

c++ stl shared-ptr c++11 directxmath

6
推荐指数
1
解决办法
756
查看次数

避免使用DirectXMath XMStore/load

我以前做过OpenGL,现在正在学习一些DirectX11.新数学库中的一件事是向量和矩阵存在加载/存储方法(例如http://msdn.microsoft.com/en-us/library/ee415635(v=vs.85).aspx).

对我来说,当我想使用它们时,我需要存储/加载每个向量和矩阵,这让我很烦恼 - 很多庞大的代码 - 我想知道是否有任何漂亮,干净的替代加载/存储过程?

c++ directx directx-11 directxmath

5
推荐指数
1
解决办法
770
查看次数

使用DirectXMath中的XMVECTOR作为类成员仅在发布模式下导致崩溃?

我一直在尝试使用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个字节之外,我还需要做其他事情吗?

c++ simd release-mode directxmath

2
推荐指数
1
解决办法
1408
查看次数

DirectX :: XMMATRIX错误C2719:__ declspec(align('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++ directx directx-11 directxmath visual-studio-2013

2
推荐指数
1
解决办法
4597
查看次数