Согласование SSE с классом

Возникла какая-то действительно странная проблема, и как новичок в С++ я не знаю, почему.

struct DeviceSettings
{
public:
....somevariables
    DXSize BackbufferSize;

....somemethods
};

struct DXPoint;
typedef DXPoint DXSize;

__declspec(align(16)) struct DXPoint
{
public:
    union
    {
        struct
        {
            int x;
            int y;
        };
        struct
        {
            int width;
            int height;
        };
        int dataint[2];
        __m128i m;
    };

    DXPoint(void);
    DXPoint(int x, int y);
    ~DXPoint(void);

    void operator = (const DXPoint& v);
};

По какой-то причине, когда я объявляю DeviceSettings, сбой приложения приводит к неправильному выравниванию переменной DXSize.

Но это только при компиляции в 32-битном режиме. В 64-битном режиме работает нормально...

Любые подсказки? Я упускаю что-то очевидное?


person feal87    schedule 10.07.2010    source источник


Ответы (1)


align declspec гарантирует только то, что __m128i выровнено относительно начала структуры данных. Если ваш распределитель памяти создает объекты, которые изначально не выровнены по 16 байтам, __m128i будет тщательно смещен. Многие современные распределители памяти обеспечивают выравнивание только по 8 байтам.

Вам нужно будет перегрузить оператор new для DXPoint, чтобы использовать распределитель с лучшим контролем выравнивания, или использовать статически выделенный и правильно выровненный __m128is, или найти какое-то другое решение.

--

Извините, я упустил из виду часть вашего вопроса «начинающий C ++». перегрузка оператора new и настраиваемые распределители памяти на самом деле не являются темами для новичков в C++. Если ваше приложение таково, что вы можете размещать свои объекты DXPoint/DXSize статически (т. е. как глобальные, а не с помощью «нового»), то это также может работать. В противном случае вы ныряете в бассейн на самом глубоком конце.

person Russell Borogove    schedule 10.07.2010
comment
решается путем выравнивания всех классов, использующих класс SSE не в режиме указателя. :П - person feal87; 11.07.2010