SSE, внутренности и выравнивание
Я написал трехмерный векторный класс, используя множество встроенных компиляторов SSE. Все работало нормально, пока я не начал создавать классы с трехмерным вектором в качестве члена с новым. Я испытал странные сбои в режиме выпуска, но не в режиме отладки и наоборот.
Поэтому я прочитал несколько статей и решил, что нужно выровнять классы, владеющие экземпляром трехмерного векторного класса, тоже по 16 байтов. Так что я просто добавил_MM_ALIGN16
(__declspec(align(16)
) перед классами вот так:
_MM_ALIGN16 struct Sphere
{
// ....
Vector3 point;
float radius
};
Это, казалось, решило проблему сначала. Но после изменения какого-то кода моя программа снова стала аварийно завершаться. Я искал в Интернете еще немного и нашелблог статья. Я попробовал то, что автор, Эрнст Хот, сделал, чтобы решить проблему, и это работает и для меня. Я добавил новые и удаляю операторы в мои классы так:
_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
};
Эрнст упоминает, что этот подход также может быть проблематичным, но он просто ссылается на форум, который больше не существует, не объясняя, почему он может быть проблематичным.
Итак, мои вопросы:
What's the problem with defining the operators?
Why isn't adding _MM_ALIGN16
to the class definition enough?
What's the best way to handle the alignment issues coming with SSE intrinsics?