Выравнивание SSE с классом - PullRequest
4 голосов
/ 10 июля 2010

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

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 не выровнена правильно.1004 *

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

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

1 Ответ

4 голосов
/ 10 июля 2010

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

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

-

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

...