Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

packed record


Dendra ©   (2002-10-13 15:14:00) 

Что это такое, не запись, а packed record. Что там такого упакованного ?


Юрий Зотов   (2002-10-14 00:30:00) [1]

"На пальцах".

Для доступа к данным их нужно адресовать. Более эффективна адресация, когда данные выравнены на границу машинного слова (иногда еще и полуслова - зависит от особенностей CPU).

Агрегатные данные (массивы и записи) состоят из нескольких элементов, размер каждого из которых не обязательно кратен машинному слову. Если каждый элемент в размещен в памяти по адресу, кратному машинному слову (т.е. выравнен на границу машинного слова), то между элементами могут остаться неиспользуемые "дырки". Такой агрегат займет больше места, но доступ к его элементам будет более быстрым - и этот способ размещения агрегатов компилятор Delphi использует по умолчанию (если не установлена птичка "aligned record fields" на странице "compiler" в опциях проекта).

Инструкция packed в объявлении агрегата явно предписывает компилятору размещать этот агрегат одним сплошным экстентом, без "дырок" (элементы выравниваются на границу байта - т. е., не выравниваются совсем), причем независимо ни от каких птичек. Соответственно, если размеры элементов этого агрегата будут не кратны машинному слову, то для их адресации будет сгенерирован дополнительный код и/или менее эффективные машинные команды. Поэтому доступ к элементам агрегата будет более медленным, но зато он займет меньше памяти.

На практике применение (или неприменение) инструкции packed может быть вызвано не только заботой об экономии памяти или повышении скорости, но и другими причинами. Например, агрегаты, объявленные в модуле Windows.pas должны быть совместимы с их прототипами в самой системе - стало быть, здесь выбора нет.


Anatoly Podgoretsky   (2002-10-14 00:02:00) [2]

Не стоит их использовать для обмена данными между программами, так как обязательно будет проблема с выравниваниями, возможно даже одной и тойже самой программой, но скомпилированной под рахными версиями или настройками, а вот внутри программы неупакованные даже очень хорошо, если на первом месте не стоит размер


Dendra   (2002-10-13 23:52:00) [3]

Действительно, а где не стоит использовать неупакованные записи ?

Юрий Зотов, объясните, пожалуйста. С представленными вами терминами я в общем знаком.


Anatoly Podgoretsky   (2002-10-13 19:52:00) [4]

Лучще бы задал вопрос, где не стоит использовать неупакованные записи


Юрий Зотов   (2002-10-13 19:41:00) [5]

1. > Ну размер будет разный. А почему ?

Из-за выравнивания.


2. > Что за выравнивание ? Можно объяснить ?

Можно, если Вы понимаете, что такое и чем отличаются друг от друга полуслово, слово, двойное слово и машинное слово. А также имеете представление о различных способах адресации. Если да - скажите, тогда я берусь объяснить, что такое выравнивание и зачем оно нужно. Если же нет - то не берусь, потому что тогда в двух словах не получится, а писать статью об азах программирования не имеет смысла - существуют книги.


3. > Зачем оно нужно?

Если вкратце - для ускорения доступа к данным. Если подробнее - см. п. 2.


Ihor Osov'yak   (2002-10-13 19:25:00) [6]

2 Dendra (13.10.02 19:04)

Ну, блин, молодеж пошла.

Сделай

var r1:trec1; r2:trec2; (см мой пред порстинг)

и сравни @r1.a c @r1.b и @r2.a c @r2.b...

Можешь также сделать прасваивание и посмотреть в памяти, какие байтики меняются.
Может и вникнешь. Если нет - два пути - очень долгое и упорное чтение толстых книжек или наверное нужно подумать о себе и программировании на предмет совместимости. Сорори за резкий ответ ....






Anatoly Podgoretsky   (2002-10-13 19:15:00) [7]

Прямой ответ - упакована сама запись, а к не упакованный более быстрый доступ


Dendra   (2002-10-13 19:04:00) [8]

Ну размер будет разный. А почему ?
Что за выравнивание ? Можно объяснить ? Зачем оно нужно ?


Ihor Osov'yak   (2002-10-13 16:42:00) [9]


2 Dendra (13.10.02 16:38)
Можно еще подробнее ? Не понял.


type
trec1 = record
a,b:byte;
end;

trec2 = packed record
a,b:byte;
end;



Сделайте sizeof(trec1) и sizeof(trec2) - надеюсь вопросы
исчезнут

Зы - в trec1 есть "дырочки" с целью выравнивания - см
alxx © (13.10.02 15:49) - кеуда уже подробней то ...


Dendra   (2002-10-13 16:38:00) [10]

Можно еще подробнее ? Не понял.


alxx   (2002-10-13 15:49:00) [11]

По умолчанию делфи выравнивает данные по слову или двойному слову для оптимизации.
Packed - отключает - получается медленнее, но все данные идут друг за другом.


Dendra   (2002-10-13 15:45:00) [12]

К сожалению, справка сейчас отсутствует на компьютере...


TTCustomDelphiMaster   (2002-10-13 15:28:00) [13]

F1 - packed (reserved word) уже ознакомились?


Наверх

Титульная страница Поиск, карта сайта Написать письмо