SSE访问冲突在对象创建时崩溃

时间:2013-07-26 20:48:53

标签: c++ c++11 compiler-errors crash sse

我创建了一个SSE驱动的矢量类。

我在一个定期调用的reduce函数中创建了一个它的实例,这导致在程序开始时崩溃。在将其声明为全局的情况下,问题不会发生。

  

错误消息:进程返回-1073741819(0xC0000005)执行   时间:3.471秒

这是简化的课程:

#include <mmintrin.h>

alignas(16) class v3
{
  public:

    // constructors
    inline v3() : m(_mm_setzero_ps()) {}
    inline v3(float x, float y, float z) : m(_mm_set_ps(0, z, y, x)) {}

    inline v3(__m128 m) : m(m) {}


    // Member variables
    union
    {
        struct { float x, y, z; };
        __m128 m;
    };
};

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

错误代码0xC0000005是访问冲突。当涉及SSE时,这总是意味着您正在尝试未对齐的内存访问。您需要确定哪个操作使用未对齐的操作数。

答案 1 :(得分:0)

我假设你使用的是Visual C ++,因为你提到了windows风格的错误代码。根据{{​​3}},Visual C ++不支持alignasalignof。使用std::aligned_storage可能会有更好的运气,例如:

union {
    _m128 m;
    struct { float x,y,z };
    std::aligned_storage<16> storage;
};