Помощь - Поиск - Пользователи - Календарь
Полная версия: Расположение данных в объекте.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
TarasBer
Поиск использовал, не нашёл ничего.

Я вот описал класс, и там были в числе прочих, где-то внутри огромного списка переменных такие строчки:


...
Color: TColor;
S1, S2: byte;
IsTrailer, IsLeft, IsRight, IsStop, IsNight: boolean;
DoorState: double;
...



В другом модуле я описал структуру:


type TAttr = record
Color: TColor;
S1, S2: byte;
IsTrailer, IsLeft, IsRight, IsStop, IsNight: boolean;
DoorState: double;
end



И завел переменную - указатель на неё:


var
Attr: ^TAttr;



Значит у меня много переменных вышеописанного класса, и общение программы с модулем происходит именно через вот этот самый Attr таким образом:


Attr := @Color;



Я предполагаю, что в объекте данные, описанные подряд, находятся тоже подряд, и поэтому, присвоив указатель таким способом, я автоматически получаю соответствие между одноимёнными переменными.
Но меня постиг облом. Так выходит, что DoorState <> Attr.DoorState;
Я очень этому удивился, и прогнал программу, просмотрев в Watches значения указателей на переменные.
И оказалось, что вот те булевские переменные идут в памяти подряд, одна за другой с шагом в 1 байт, а вот DoorState почему-то отстоит от IsNight на 2 байта!
Так вот, какой быстрый способ присвоения этого Attr вы посоветуете? Или как настроить компилятор, чтобы данные располагались как положено?

volvo
Выравнивание на сколько стоит?

Если добавить {$A1} перед описанием класса, то будет так, как тебе надо...
TarasBer
Выравнивание - по 8... Странно, а почему булевские переменные тогда подряд шли? Это из-за оптимизации?
Ну я добавил {$A1} и перед описание класса, и перед описанием типа TAttr, помогло вроде, спасибо.
andriano
Компилято располагает переменные так, чтобы процессор имел к ним доступ ЗА ОДНУ операцию.
Для однобайтовых величин - это всегда так. Для многобайтовых - нет, зависит от выравнивания.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.