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?

Ответы на вопрос(3)

Ваш ответ на вопрос