SSE, intrinsics i alignment

Napisałem klasę wektorów 3D przy użyciu wielu wewnętrznych elementów kompilatora SSE. Wszystko działało dobrze, dopóki nie zacząłem inicjować klas mających wektor 3D jako członka z nowymi. Doświadczyłem dziwnych awarii w trybie zwolnienia, ale nie w trybie debugowania i na odwrót.

Więc przeczytałem kilka artykułów i pomyślałem, że muszę wyrównać klasy będące właścicielami instancji klasy wektorowej 3D do 16 bajtów. Właśnie dodałem_MM_ALIGN16 (__declspec(align(16)) przed takimi klasami:

_MM_ALIGN16 struct Sphere
{
    // ....

    Vector3 point;
    float radius
};

Wydawało się, że na początku rozwiązało to problem. Ale po zmianie jakiegoś kodu mój program znów zaczął się załamywać. Przeszukałem jeszcze trochę sieć i znalazłemblog artykuł. Spróbowałem tego, co autor, Ernst Hot, zrobił, aby rozwiązać ten problem i to też działa dla mnie. Dodałem nowe i usunąłem operatorów do moich klas w następujący sposób:

_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 wspomina, że ​​to podejście może być również problematyczne, ale po prostu łączy się z forum, które już nie istnieje, bez wyjaśnienia, dlaczego może to być problematyczne.

Moje pytania to:

Jaki jest problem z definiowaniem operatorów?

Dlaczego nie dodaje_MM_ALIGN16 wystarczy definicja klasy?

Jaki jest najlepszy sposób radzenia sobie z problemami z wyrównaniem pochodzącymi z intrinsics SSE?

questionAnswers(3)

yourAnswerToTheQuestion