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* pointers[count] станаха T objects[count], така че това вече не се разпределя...   -  person moala    schedule 24.02.2010


Отговори (1)


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

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

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