Форум: "Основная";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];
Внизpacked record Найти похожие ветки
← →
Dendra (2002-10-13 15:14) [0]Что это такое, не запись, а packed record. Что там такого упакованного ?
← →
TTCustomDelphiMaster (2002-10-13 15:28) [1]F1 - packed (reserved word) уже ознакомились?
← →
Dendra (2002-10-13 15:45) [2]К сожалению, справка сейчас отсутствует на компьютере...
← →
alxx (2002-10-13 15:49) [3]По умолчанию делфи выравнивает данные по слову или двойному слову для оптимизации.
Packed - отключает - получается медленнее, но все данные идут друг за другом.
← →
Dendra (2002-10-13 16:38) [4]Можно еще подробнее ? Не понял.
← →
Ihor Osov'yak (2002-10-13 16:42) [5]
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 19:04) [6]Ну размер будет разный. А почему ?
Что за выравнивание ? Можно объяснить ? Зачем оно нужно ?
← →
Anatoly Podgoretsky (2002-10-13 19:15) [7]Прямой ответ - упакована сама запись, а к не упакованный более быстрый доступ
← →
Ihor Osov'yak (2002-10-13 19:25) [8]2 Dendra (13.10.02 19:04)
Ну, блин, молодеж пошла.
Сделай
var r1:trec1; r2:trec2; (см мой пред порстинг)
и сравни @r1.a c @r1.b и @r2.a c @r2.b...
Можешь также сделать прасваивание и посмотреть в памяти, какие байтики меняются.
Может и вникнешь. Если нет - два пути - очень долгое и упорное чтение толстых книжек или наверное нужно подумать о себе и программировании на предмет совместимости. Сорори за резкий ответ ....
← →
Юрий Зотов (2002-10-13 19:41) [9]1. > Ну размер будет разный. А почему ?
Из-за выравнивания.
2. > Что за выравнивание ? Можно объяснить ?
Можно, если Вы понимаете, что такое и чем отличаются друг от друга полуслово, слово, двойное слово и машинное слово. А также имеете представление о различных способах адресации. Если да - скажите, тогда я берусь объяснить, что такое выравнивание и зачем оно нужно. Если же нет - то не берусь, потому что тогда в двух словах не получится, а писать статью об азах программирования не имеет смысла - существуют книги.
3. > Зачем оно нужно?
Если вкратце - для ускорения доступа к данным. Если подробнее - см. п. 2.
← →
Anatoly Podgoretsky (2002-10-13 19:52) [10]Лучще бы задал вопрос, где не стоит использовать неупакованные записи
← →
Dendra (2002-10-13 23:52) [11]Действительно, а где не стоит использовать неупакованные записи ?
Юрий Зотов, объясните, пожалуйста. С представленными вами терминами я в общем знаком.
← →
Anatoly Podgoretsky (2002-10-14 00:02) [12]Не стоит их использовать для обмена данными между программами, так как обязательно будет проблема с выравниваниями, возможно даже одной и тойже самой программой, но скомпилированной под рахными версиями или настройками, а вот внутри программы неупакованные даже очень хорошо, если на первом месте не стоит размер
← →
Юрий Зотов (2002-10-14 00:30) [13]"На пальцах".
Для доступа к данным их нужно адресовать. Более эффективна адресация, когда данные выравнены на границу машинного слова (иногда еще и полуслова - зависит от особенностей CPU).
Агрегатные данные (массивы и записи) состоят из нескольких элементов, размер каждого из которых не обязательно кратен машинному слову. Если каждый элемент в размещен в памяти по адресу, кратному машинному слову (т.е. выравнен на границу машинного слова), то между элементами могут остаться неиспользуемые "дырки". Такой агрегат займет больше места, но доступ к его элементам будет более быстрым - и этот способ размещения агрегатов компилятор Delphi использует по умолчанию (если не установлена птичка "aligned record fields" на странице "compiler" в опциях проекта).
Инструкция packed в объявлении агрегата явно предписывает компилятору размещать этот агрегат одним сплошным экстентом, без "дырок" (элементы выравниваются на границу байта - т. е., не выравниваются совсем), причем независимо ни от каких птичек. Соответственно, если размеры элементов этого агрегата будут не кратны машинному слову, то для их адресации будет сгенерирован дополнительный код и/или менее эффективные машинные команды. Поэтому доступ к элементам агрегата будет более медленным, но зато он займет меньше памяти.
На практике применение (или неприменение) инструкции packed может быть вызвано не только заботой об экономии памяти или повышении скорости, но и другими причинами. Например, агрегаты, объявленные в модуле Windows.pas должны быть совместимы с их прототипами в самой системе - стало быть, здесь выбора нет.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c