IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Расположение данных в объекте.
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Поиск использовал, не нашёл ничего.

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


...
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 вы посоветуете? Или как настроить компилятор, чтобы данные располагались как положено?



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

Если добавить {$A1} перед описанием класса, то будет так, как тебе надо...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Выравнивание - по 8... Странно, а почему булевские переменные тогда подряд шли? Это из-за оптимизации?
Ну я добавил {$A1} и перед описание класса, и перед описанием типа TAttr, помогло вроде, спасибо.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Компилято располагает переменные так, чтобы процессор имел к ним доступ ЗА ОДНУ операцию.
Для однобайтовых величин - это всегда так. Для многобайтовых - нет, зависит от выравнивания.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 30.09.2020 7:12
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name