c++ InterlockedExchangePointer и выравнивание указателя

В документации для функции InterlockedExchangePointer указано:

В 64-битной системе параметры являются 64-битными, а целевой параметр должен быть выровнен по 64-битным границам; в противном случае функция будет вести себя непредсказуемо. В 32-разрядной системе параметры являются 32-разрядными, а целевой параметр должен быть выровнен по 32-разрядным границам.

Я компилирую для 32-битной, и программа работает на 32-битной и 64-битной архитектурах; Предоставляет ли следующая структура указатели, которые может использовать InterlockedExchangePointer в любой (32- или 64-битной) работающей архитектуре без адаптации кода?

template <class T>
struct Foo {
    enum { count = 3 };
    __declspec(align(64)) T objects[count];
};

(Я предполагаю, что если один указатель выровнен по 64 битам, он также выровнен по 32 битам, даже если есть заполнение при работе на 32 битах)

Спасибо.


person moala    schedule 23.02.2010    source источник
comment
Я не думаю, что это имеет значение - 64-битные и 32-битные сборки будут генерировать разные инструкции. Запуск 32-битного двоичного файла под 64-битной ОС по-прежнему дает вам 32-битную виртуальную машину.   -  person Nikolai Fetissov    schedule 23.02.2010
comment
Вам вообще не нужно возиться с __declspec. Указатели (как и все другие типы данных) автоматически выравниваются при нормальном размещении. Это примечание к документации просто указывает на то, что оно не будет работать, если вы вручную испортите выравнивание.   -  person jalf    schedule 23.02.2010
comment
jalf, Ну, я накосячил с выделенным хранилищем и выравниванием объекта-члена без указателя; void* указатели[количество] стали T объектами[количество], так что это больше не выделяется...   -  person moala    schedule 24.02.2010


Ответы (1)


На 64-битной системе программа, написанная для 32-битной платформы, будет работать через слой совместимости (WoW, Windows на Windows), а ваши указатели должны быть выровнены по 32-битной системе.

Но, если вы скомпилируете свою программу в 64-битном режиме, ваши указатели будут автоматически выровнены по 64-битным.

person werewindle    schedule 23.02.2010
comment
Я запутался с выделенным хранилищем и выравниванием объекта-члена без указателя; Я отредактировал тип члена (void* array -> T); пожалуйста, просмотрите свой ответ, если это необходимо. - person moala; 24.02.2010
comment
@моала. В любом случае компилятор по умолчанию (если не используются такие теги, как #pragma pack) будет выравнивать указатели по границе 32/64 бит. - person werewindle; 25.02.2010