Я написал трехмерный векторный класс, используя множество встроенных встроенных компиляторов SSE. Все работало нормально, пока я не начал устанавливать классы с 3D-вектором в качестве члена с новым. Я пережил странные сбои в режиме выпуска, но не в режиме отладки и наоборот.
Итак, я прочитал несколько статей и понял, что мне нужно выровнять классы, владеющие экземпляром трехмерного векторного класса, и 16 байт. Поэтому я просто добавил _MM_ALIGN16
(__declspec(align(16)
) перед такими классами:
_MM_ALIGN16 struct Sphere
{
// ....
Vector3 point;
float radius
};
Это, похоже, сначала решило проблему. Но после изменения кода моя программа снова начала сбой чересчур. Я несколько раз искал в Интернете и нашел статью blog. Я попробовал то, что сделал автор, Эрнст Хот, для решения проблемы, и это работает и для меня. Я добавил новые и удалять операторы для своих классов следующим образом:
_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 упоминает, что этот aproach также может быть проблематичным, но он просто ссылается на форум, который больше не существует, не объясняя, почему это может быть проблематичным.
Итак, мои вопросы:
-
Какова проблема с определением операторов?
-
Почему добавление
_MM_ALIGN16
в определение класса достаточно? -
Каков наилучший способ справиться с проблемами выравнивания, возникающими с помощью встроенных функций SSE?