Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Внизpacked Найти похожие ветки
← →
SergP © (2006-02-04 23:56) [0]Есть небольшой вопрос:
Если я использую какую-нить структуру, размер элементов которого кратен 4 байтам, будет ли разница в том применяю ли я в описании этого типа packed или не применяю?
И всегда ли?
← →
Lamer@fools.ua © (2006-02-05 00:06) [1]Бывает ещё
{$A8}
.
В общем, "$Align" + F1.
← →
PAVIA © (2006-02-05 02:51) [2]Будет притом всегда.
← →
SergP © (2006-02-05 07:54) [3]
> Lamer@fools.ua © (05.02.06 00:06) [1]
> Бывает ещё {$A8}.
Я так понял, что по умолчанию 8 а не 4, как я думал раньше. (Кстати какой смысл ставить 8 на 32-разрядных процессорах?)
Хорошо...Тогда такой вопрос:
Эквивалентно ли такое описание:
{$A-}
A: array of record
...
{$A+}
такому:
A: packed array of packed record
...
?
← →
Defunct © (2006-02-05 08:07) [4]packed не распространяется на array.
packed распространяется только на record.
> Я так понял, что по умолчанию 8 а не 4, как я думал раньше. (Кстати какой смысл ставить 8 на 32-разрядных процессорах?)
не забываейте об MMX и SSE/SSE2. некоторые команды работают эффективнее с выравниванием на границу 8. А некоторые команды вообще не работают без такого выравнивания. Например.
movq - эффективнее с выравниванием на границу 8
movdqa - вообще не работает если нет выравнивания на границу 8.
если действительно интересно можете почитать Intel Architecture Software Development Manual (volume 2)
← →
begin...end © (2006-02-05 08:20) [5]> Defunct © (05.02.06 08:07) [4]
> packed распространяется только на record.
Packed распространяется не только на record.
← →
SergP © (2006-02-05 08:21) [6]
> Defunct © (05.02.06 08:07) [4]
> packed не распространяется на array.
> packed распространяется только на record.
Вот цитата из Фаронова:
В целях совместимости со стандартным Pascal в Delphi разрешается перед описанием структурированного типа ставить зарезервированное слово packed ...
Автор не пишет что только перед record, а пишет что перед описанием структурированного типа, которым array также является.
Или это следует понимать по другому?
Вобщем в моем случае имеется большой массив записей, где не требуется быстродействие при работе с каждым элементом в отдельности, но требуется быстродействие при работе с блоком памяти, занимаемым всем массивом целиком, поэтому я подумал, что чем меньше размер массива, тем лучше.
← →
Defunct © (2006-02-05 08:30) [7]begin...end © (05.02.06 08:20) [5]
на что еще?
← →
SergP © (2006-02-05 08:33) [8]хм... Проверил... Вроде бы разницы array или packed array не заметил...(правда пробовал только на статических массивах)...
Хотя Delphi не ругается на packed перед array
← →
begin...end © (2006-02-05 08:34) [9]> Defunct © (05.02.06 08:30) [7]
На class, например.
← →
Defunct © (2006-02-05 08:39) [10]SergP © (05.02.06 08:33) [8]
разницы нет ни для статических ни для динамических массивов, посколу они всегда и так packed.
← →
Defunct © (2006-02-05 08:42) [11]begin...end © (05.02.06 08:34) [9]
ну да, но это, как и object, частный случай record . (если можно так выразиться)
← →
begin...end © (2006-02-05 08:46) [12]> Defunct © (05.02.06 08:42) [11]
> если можно так выразиться
Нельзя.
← →
Defunct © (2006-02-05 09:14) [13]кому как.
принципиальной разницы в организации полей данных record/object/class, как для меня, нет.
← →
begin...end © (2006-02-05 09:39) [14]> Defunct © (05.02.06 09:14) [13]
Одно лишь отсутствие принципиальной разницы в организации полей не позволяет утверждать, что class -- частный случай record. Этак можно сказать, что set -- это частный случай array, и т.д.
В утверждении из [4] ясно указано, что речь идёт о record. Поэтому оно неверно.
← →
Sapersky (2006-02-05 14:17) [15]2SergP:
Основной принцип дельфийского выравнивания: дополнительные байты вставляются в том случае, если какое-то поле записи попадает НА ГРАНИЦУ 4-х, для примера, байтов.
Т.е., например:
TRec = record
a,b : Byte;
c : Word;
end;
- общий размер 4 байта, т.к. все поля уложились в dword.
TRec = record
a,b,c : Byte;
d : Word;
end;
- общий размер 6 байт, т.к. половина d попала в 1-й dword, половина - во второй; d сдвигается на 1 байт.
TRec = record
i : Integer;
a,b,c : Byte;
d : Word;
end;
- общий размер... 12 байт, т.к. он округляется до размера кратного макс. размеру поля (точнее, максимальному выравниванию поля, которое в данном случае = размеру).
Такая вот хитрая логика :)
Если кто сомневается - это всё написано в help: Object Pascal Reference\Memory management\Record types.
Массивы, похоже, действительно всегда packed.
Кстати какой смысл ставить 8 на 32-разрядных процессорах?
Вроде бы это связано с особенностями доступа к памяти у P4.
Для MMX/SSE Дельфи слабо приспособлен, всё приходится выравнивать вручную - и размер записи, и начало обрабатываемой области памяти (GetMem выравнивает на 4).
Packed распространяется не только на record.
На class, например.
Пытался написать TForm1 = packed class... не прошло. Или что-то другое имелось в виду?
AFAIK, классы всегда выравниваются, т.е. не-packed.
← →
begin...end © (2006-02-05 15:53) [16]> Sapersky (05.02.06 14:17) [15]
> Пытался написать TForm1 = packed class... не прошло.
А у меня прошло. Delphi 7.
P.S. И справка говорит, что packed можно писать в объявлении любого структурированного типа, а class именно таким типом и является.
← →
Sapersky (2006-02-05 16:22) [17]А, ясно, у меня Delphi 5.
← →
tesseract © (2006-02-05 17:39) [18]
> Если я использую какую-нить структуру, размер элементов
> которого кратен 4 байтам, будет ли разница в том применяю
> ли я в описании этого типа packed или не
Все структуры без packed кратны 4 байтам. Это делается для увеличения производительности intel процессоров.
> Пытался написать TForm1 = packed class... не прошло. Или
> что-то другое имелось в виду?
А зачем тебе? ведь можно объявить поле в классе и объявить его packed record.
← →
begin...end © (2006-02-05 18:48) [19]> tesseract © (05.02.06 17:39) [18]
> Все структуры без packed кратны 4 байтам.
Ой.
← →
SergP © (2006-02-05 20:12) [20]
> Defunct © (05.02.06 08:39) [10]
> SergP © (05.02.06 08:33) [8]
>
> разницы нет ни для статических ни для динамических массивов,
> посколу они всегда и так packed.
А каков смысл выравнивания в записях, если иногда приходится использовать массивы записей?
Допустим
type Mrec=record
a1:word;
a2:byte;
a3:word;
a4:byte;
end;
Размер записи при выравнивании на 4 будет равен 7
А теперь создадим массив:
x:array of Mrec;
Если размер элемента массива равен размеру записи (потому как массив всегда packed), то получается что выравнивание в записи нам ничего не дает?
← →
begin...end © (2006-02-05 20:44) [21]> SergP © (05.02.06 20:12) [20]
> Если размер элемента массива равен размеру записи (потому
> как массив всегда packed), то получается что выравнивание
> в записи нам ничего не дает?
Наличие/отсутствие packed в описании массива не влияет на размер его элемента.
Если тип записи (элемента массива) объявлен с указанием packed, то запись будет упакованной (т.е. её поля будут "прижаты" друг к другу) -- вне зависимости от того, будет ли она элементом упакованного или неупакованного массива, или какого-либо другого типа. А если тип записи объявлен без packed, то запись будет неупакованной -- и опять же, не имеет значения, в составе какого типа она находится.
А в описании массива указание packed теоретически должно влиять на то, будут ли сами элементы массива "прижаты" друг к другу. Но на практике, как уже было сказано, массивы всегда упакованы -- по крайней мере, пока.
← →
SergP © (2006-02-05 21:04) [22]
> begin...end © (05.02.06 20:44) [21]
Ну это понятно... Я просто хотел сказать что в приведенном мной примере
> SergP © (05.02.06 20:12) [20]
Несмотря на то что запись неупакована (т.е. элементы выравнены на 4), в массиве этих записей достоинство выравнивания записи должно потеряться (если учесть что размер записи - 7 (т.е. не кратное величине выравнивания).
Или лучше поясню схематически:
0 ------------------------------------------------------
.
. нулевой элемент массива (все элементы записи выравнены по 4)
.
4
.
.
. -----------------------------------------------------
8
.
. первый элемент массива (несмотря на то что в описании записи
. ее элементы выравнены, на самом деле запись будет сдвинута
12 относительно границы выравнивания
.
.---------------------------------------------------
.
16
Вот насчет этого скажите - правильно ли я понял?
← →
Defunct © (2006-02-06 02:39) [23]> Размер записи при выравнивании на 4 будет равен 7
будет равен 8.
проверьте сами sizeof( mrec ).
← →
SergP © (2006-02-06 08:48) [24]
> Defunct © (06.02.06 02:39) [23]
> > Размер записи при выравнивании на 4 будет равен 7
>
> будет равен 8.
> проверьте сами sizeof( mrec ).
проверил. Кроме этого провери еще 2 записи:
Размер этой записи 6 байт:
type Mrec1=record
a1:word;
a2:word;
a3:word;
end;
А этой 8 байт:
type Mrec2=record
a1:cardinal;
a2:word;
end;
Хм. Действительно...
Оказывается компилятор умный очень.... Не ожидал... Недооценивал я его...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.034 c