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

C++ 使用DirectXMath中的XMVECTOR作为类成员只会在发布模式下导致崩溃?,c++,simd,release-mode,directxmath,C++,Simd,Release Mode,Directxmath,我一直在尝试使用XMVECTOR作为边界框的类成员,因为我做了很多计算,但是我每帧只使用一次XMFLOAT3,所以边界框有一个方法,它的中心在XMFLOAT3中,否则它会留在XMVECTOR中;该类由uu declspec(align(16))处理,并在调试模式下工作。但是在发布模式下,当我将其设置为某个值时,它会崩溃: Box& Box::operator=(const Box& box) { _center = box._center;

我一直在尝试使用XMVECTOR作为边界框的类成员,因为我做了很多计算,但是我每帧只使用一次XMFLOAT3,所以边界框有一个方法,它的中心在XMFLOAT3中,否则它会留在XMVECTOR中;该类由uu declspec(align(16))处理,并在调试模式下工作。但是在发布模式下,当我将其设置为某个值时,它会崩溃:

    Box& Box::operator=(const Box& box)
    {
        _center = box._center;
        _extents = box._extents;
        return *this;
    }
每当我这样做:

Box A;

Box B;

A = B;
它崩溃,给我0xC0000005:访问冲突读取位置0x00000000。 当我将其创建为指针时,它也会崩溃:

Box* A = new Box();
这是构造器:

    Box::Box()
    {
        center = XMVectorZero();
        extents = XMVectorSplatOne();
    }

同样,这在调试模式下工作正常,但在发布模式下会崩溃。发布模式会发生什么变化,从而生成无效代码?除了将框对齐到16字节之外,我还需要做其他事情吗?

该类不是在对齐的地址创建的,因此即使XM*成员在16字节边界上对齐,父对象的对齐未对齐,导致崩溃

为了防止这种情况发生,您需要使用
\u mm\u alloc
(它实际上只是包装),或者将默认分配器替换为返回最小对齐为16字节的块的分配器(在x64下,这种情况下使用默认分配器)

<>这是C++中的一个简单的解决方案,它为所有类创建一个基类,其中包含如下的XM*成员:

template<size_t Alignment> class AlignedAllocationPolicy
{
    public:
    static void* operator new(size_t size)
    {
        return _aligned_malloc(size,Alienment);
    }

    static void operator delete(void* memory)
    {
        _aligned_free(memory);
    }
};

class MyAlignedObject : public AlignedAllocationPolicy<16>
{
//...
};
模板类对齐分配策略
{
公众:
静态void*运算符新(大小\u t大小)
{
返回对齐(大小、对齐);
}
静态void运算符删除(void*内存)
{
_无内存;
}
};
类MyAlignedObject:公共AlignedAllocationPolicy
{
//...
};

正如@Dave所指出的,这是一个最小的示例,您希望重载所有
new
delete
操作符,特别是
new[]
delete[]< /代码> < /P>?我不再需要DESCFEC.Alcon?他们不应该做同样的事情吗?或者是用MyLoMy8的类专门为MyDLO C++?@ DEIMOS:从MSDN页面获取<代码>Win32分配器返回的内存很可能没有充分对齐u declspec(align(#))结构或结构数组。
因此,它只会影响编译器控制的分配,例如堆栈和堆栈变量,以及结构/类偏移对齐
\u-mm\u-malloc
&
\u-aligned\u-malloc
返回正确分配的数据,其中
\u-mm\u-malloc
是SSE类型的宏速记。有关xmmath的此主题的另一讨论,请参阅的类型使用指南。您可能还需要数组运算符[]来进行更正。我知道我最终需要它们;此外,如果您使用DXUT,请记住如果您使用他们的GUI,它将使用分配器在代码中分配数组(从标题),然后在自己的代码中释放数组;因此,必须将所有4个运算符放在DXUT.H中,以便正确地进行互操作。如果您对DirectXMath是新的,则应该考虑使用包来为您透明地处理对齐问题。注意,您不需要创建<代码>框类。包含已在
DirectXCollision.h
标题中的
BoundingBox