首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DirectXMath中的XMVECTOR作为类成员会导致仅在发布模式下崩溃吗?

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

Stack Overflow用户
提问于 2013-04-02 07:10:04
回答 1查看 1.5K关注 0票数 2

我一直试图使用XMVECTOR作为边界框的类成员,因为我做了很多计算,但我每帧只使用一次XMFLOAT3,所以边界框有一个方法,它在XMFLOAT3中给我中心,否则它留在XMVECTOR中;该类使用__declspec(align(16))删除,并在发布模式下使用调试mode.However,当我将其设置为某个值时,它立即崩溃:

代码语言:javascript
复制
    Box& Box::operator=(const Box& box)
    {
        _center = box._center;
        _extents = box._extents;
        return *this;
    }

每当我这样做的时候:

代码语言:javascript
复制
Box A;

Box B;

A = B;

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

代码语言:javascript
复制
Box* A = new Box();

这是构造函数:

代码语言:javascript
复制
    Box::Box()
    {
        center = XMVectorZero();
        extents = XMVectorSplatOne();
    }

同样,这在调试模式下工作得很好,但是在发布模式中,crashes.What会改变发布模式,从而产生无效的代码吗?除了将方框对齐到16字节之外,我还需要做其他事情吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-02 07:15:50

类不是在对齐的地址上创建的,因此即使XM*成员在16字节边界上对齐,父成员的对齐也会导致它们未对齐,从而导致崩溃。

为了防止这种情况,你需要使用_mm_alloc (它实际上只是包装了_aligned_alloc),或者用一个返回最小16字节对齐的块的默认分配器来代替(在x64下,默认分配器就是这种情况)。

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

代码语言:javascript
复制
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>
{
//...
};

正如@Dave所指出的,这是一个最小的示例,您可能希望重载所有的newdelete操作符,特别是new[]delete[]

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15753465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档