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



我创建了一个SSE供电的矢量类。

我在一个周期性调用的缺陷函数中创建了一个它的实例,这会导致程序在启动时崩溃。在宣布其为全球性的情况下,问题不会发生。

错误消息:进程返回-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;
    };
};

知道吗?

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

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

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

最新更新