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