我创建了一个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++不支持alignas
或alignof
。使用std::aligned_storage
可能运气更好,例如:
union {
_m128 m;
struct { float x,y,z };
std::aligned_storage<16> storage;
};