我使用大量 SSE 编译器内在函数编写了一个 3D 矢量类。一切都很好,直到我开始将具有 3D 矢量的类作为 new 的成员。我在发布模式下遇到了奇怪的崩溃,但在调试模式下却没有,反之亦然。
所以我阅读了一些文章,并认为我需要将拥有 3D 矢量类实例的类也对齐到 16 个字节。所以我只是在类前面添加了_MM_ALIGN16
(__declspec(align(16)
),如下所示:
_MM_ALIGN16 struct Sphere
{
// ....
Vector3 point;
float radius
};
起初这似乎解决了这个问题。但是在更改了一些代码之后,我的程序又开始以奇怪的方式崩溃。我在网上搜索了一些,发现了一篇博客文章。我尝试了作者 Ernst Hot 解决问题的方法,它也对我有用。我在我的类中添加了 new 和 delete 运算符,如下所示:
_MM_ALIGN16 struct Sphere
{
// ....
void *operator new (unsigned int size)
{ return _mm_malloc(size, 16); }
void operator delete (void *p)
{ _mm_free(p); }
Vector3 point;
float radius
};
Ernst 提到这种方法也可能存在问题,但他只是链接到一个不再存在的论坛,而没有解释为什么它可能存在问题。
所以我的问题是:
定义运算符有什么问题?
为什么添加
_MM_ALIGN16
到类定义中还不够?处理 SSE 内在函数带来的对齐问题的最佳方法是什么?