Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Что такое packed array и packed record?   Найти похожие ветки 

 
GrayFace ©   (2005-01-07 09:52) [0]

сабж.


 
begin...end ©   (2005-01-07 09:55) [1]

> GrayFace ©   (07.01.05 09:52)

Упакованный массив и упакованная запись.


 
GrayFace ©   (2005-01-07 09:57) [2]

Ой. Сорри. В справку не заглянул. Бывает же такое!
Но все-таки уточню: packed array может быть нужен только при хранении структур с размером, не кратным 4 байтам?


 
begin...end ©   (2005-01-07 10:06) [3]

> [2] GrayFace ©   (07.01.05 09:57)

Насчёт 4-х байт точно не могу сказать. Лучше, ИМХО, при любой структуре явно указывать packed в том случае, если явно требуется независимость размера от каких-либо выравниваний.


 
uny ©   (2005-01-07 10:32) [4]

а если record не packed - как её в файл писать читать?


 
Gero ©   (2005-01-07 10:51) [5]


> uny ©   (07.01.05 10:32)

Так же, как и packed.


 
KSergey ©   (2005-01-07 10:59) [6]

> [4] uny ©   (07.01.05 10:32)
> а если record не packed - как её в файл писать читать?

Точно так же
Только надо быть уверенным, что за время между write/read правила выравнивания не изменились (смена компилятора/платформы/настройки компилятора)


 
uny ©   (2005-01-07 11:07) [7]

>Только надо быть уверенным
не радует как то.. пусть тогда packed будет


 
Poirot ©   (2005-01-07 13:24) [8]

только маленькое но - где-0то видел, что не советуют использовать packed - это может снизить производительность, ибо 32 всётаки сейчас разрядность процессора и если пытаться использовать что-то в районе 16-24 то это нехзорошо скажется... вообщем некоторые проци вообще оптимизированы на работу с 32 разрядами и оочень тормозят с другими типами.


 
Anatoly Podgoretsky ©   (2005-01-07 13:36) [9]

uny ©   (07.01.05 11:07) [7]
Этого недостаточно, надо еще пользоваться фундаментальными типами, поскольку производные (общии) имеют точно такую же тенденцию менять размер.

Poirot ©   (07.01.05 13:24) [8]
Это хорошо, пока не потребуется мобильность.


 
PVOzerski ©   (2005-01-07 15:53) [10]

Касательно packed array: у меня всегда было такое чувство, что массивы в Delphi являются packed всегда. Вот такой кусочек, прогнанный на D3 и D6, это подтвердил: выдал две пятерки. Хотя как в Delphi.Net - не знаю.


implementation

{$R *.dfm}
var
a:array[1..5] of byte;
b:packed array[1..5] of byte;
initialization
ShowMessage(IntToStr(sizeof(a))+" "+IntToStr(sizeof(b)));
end.


 
dimaxx ©   (2005-01-07 16:18) [11]

При включенной опции проекта Aligned record fields размеры записей, у которых отсутствует packed, будут выравниваться на 32-битную границу (кратно 4). Если packed присутствует, тогда размеры останутся неизменными.

Пример:

A: packed record
 ID: integer;
 Count: word;
end;


Размер равен 6 байтам независимо от установленной опции. Если убрать packed, то размер будет равен 8 байт.

Если опцию выключить, то тогда присутствие packed вообще необязательно.

Тоже самое относится к массивам.


 
GuAV ©   (2005-01-07 16:26) [12]

dimaxx ©   (07.01.05 16:18) [11]

AFAIK, это опция не вкл/выкл, а 1-2-4-8.


 
PVOzerski ©   (2005-01-07 16:27) [13]

>Тоже самое относится к массивам.
Большая просьба показать это на примере.


 
Anatoly Podgoretsky ©   (2005-01-07 17:07) [14]

PVOzerski ©   (07.01.05 15:53) [10]
Нехороший пример, поскольку байт. Попробуй array [..] of 5 byte, но вероятнее всего будет тоже.


 
palva ©   (2005-01-07 17:10) [15]

Я уже попробовал - то же самое. Правда у меня был array [] of record, а в record были word и byte.


 
Anatoly Podgoretsky ©   (2005-01-07 17:14) [16]

palva ©   (07.01.05 17:10) [15]
А рекорд был упакованный или нет?


 
PVOzerski ©   (2005-01-07 17:39) [17]

implementation
{$align on}
type
t5=packed record
 b0,b1,b2,b3,b4:byte;
end;
a=array[1..5]of t5;
b=packed array[1..5]of t5;
initialization
ShowMessage(IntToStr(Sizeof(a))+" "+IntToStr(Sizeof(b)));
{$R *.DFM}

end.

Выдал на D3:
25 25
Годится?


 
dimaxx ©   (2005-01-08 04:04) [18]

2 GuAV: Что ты хочешь этим сказать? Выравнивание как раз зависит от этой опции проекта ($A+ или $ALIGN ON в тексте).


 
GuAV ©   (2005-01-08 14:20) [19]

The $A directive controls alignment of fields in Delphi record types and class structures.
In the {$A1} or {$A-} state, fields are never aligned. All record and class structures are packed.
In the {$A2} state, fields in record types that are declared without the packed modifier and fields in class structures are aligned on word boundaries.
In the {$A4} state, fields in record types that are declared without the packed modifier and fields in class structures are aligned on double-word boundaries.

In the {$A8} or {$A+} state, fields in record types that are declared without the packed modifier and fields in class structures are aligned on quad word boundaries.


 
dimaxx ©   (2005-01-09 00:23) [20]

Понял...


 
GrayFace ©   (2005-01-14 14:30) [21]

Anatoly Podgoretsky ©   (07.01.05 13:36) [9]
Этого недостаточно, надо еще пользоваться фундаментальными типами, поскольку производные (общии) имеют точно такую же тенденцию менять размер.

А какие типы являются производными?


 
MBo ©   (2005-01-14 14:37) [22]

В справке Integer types
в нижней табличке - фундаментальные типа постоянного размера, в верхней - generic  - Integer и Cardinal, относящиеся к текущей аппаратной платформе.
Вот Integer раньше (в 16-разрядную эпоху) был двухбайтным, например.


 
GrayFace ©   (2005-01-14 18:38) [23]

Спасибо.


 
Anatoly Podgoretsky ©   (2005-01-14 18:40) [24]

GrayFace ©   (14.01.05 18:38) [23]
Индетично по строковым и символным типа. Char/String это generic, с приставками в основном фундаментальные.



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.046 c
1-1105902162
glGLU
2005-01-16 22:02
2005.01.30
Работа с ini


1-1105961360
Кабан
2005-01-17 14:29
2005.01.30
Где взять иконки с палитры компонентов Delphi?


14-1105551078
Mixi
2005-01-12 20:31
2005.01.30
FOREX


8-1097935584
Yegorchic
2004-10-16 18:06
2005.01.30
Загрузка .3ds


1-1106134081
Putnik
2005-01-19 14:28
2005.01.30
Распределение случайных чисел