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 13.12.2007 1:08
Выравнивание на сколько стоит?
Если добавить {$A1} перед описанием класса, то будет так, как тебе надо...
Автор: TarasBer 13.12.2007 1:50
Выравнивание - по 8... Странно, а почему булевские переменные тогда подряд шли? Это из-за оптимизации? Ну я добавил {$A1} и перед описание класса, и перед описанием типа TAttr, помогло вроде, спасибо.
Автор: andriano 13.12.2007 3:00
Компилято располагает переменные так, чтобы процессор имел к ним доступ ЗА ОДНУ операцию. Для однобайтовых величин - это всегда так. Для многобайтовых - нет, зависит от выравнивания.