【问题标题】:SSE Access Violation crash on object creation对象创建时 SSE 访问冲突崩溃
【发布时间】:2013-07-26 20:48:52
【问题描述】:

我创建了一个 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;
    };
};

有什么想法吗?

【问题讨论】:

  • 错误信息是什么?它是在代码中的哪一点提出的?
  • 进程返回-1073741819 (0xC0000005) 执行时间: 3.471 s 它相对发生在程序开始时。
  • 您应该在调试器中运行您的程序,然后提供发生崩溃的代码。您很可能会遇到错位问题。
  • 是的,我想这与它超出范围的那一刻有关。
  • 你是把它放在一个 STL 容器里吗? STL 容器不对齐。

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


【解决方案1】:

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

【讨论】:

  • 没有任何操作,我只是创建一个对象。
  • @plasmacel ...并运行其默认构造函数。
  • 我执行以下行(导致错误):v3 testvec;
【解决方案2】:

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

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

【讨论】:

  • 我使用 GCC,所以它是受支持的。为了向后兼容,我制作了一个编译器属性宏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2012-05-13
  • 2014-12-25
相关资源
最近更新 更多