Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.52 MB
Время: 0.036 c
2-1139522750
Змей
2006-02-10 01:05
2006.02.26
Char->String; String->Char


2-1139620367
Ламерище
2006-02-11 04:12
2006.02.26
Отправить файл на мыло


1-1138354044
linox
2006-01-27 12:27
2006.02.26
таймер и обратній отсчет


2-1139212210
Der Nechk@SSOFF
2006-02-06 10:50
2006.02.26
выбор процедуры


15-1139151076
Вячеслав Бессонов
2006-02-05 17:51
2006.02.26
TOpenDialog и TSaveDialog





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский