Главная страница
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.053 c
1-1106109186
Marat
2005-01-19 07:33
2005.01.30
Ошибка в FormShow


3-1103792142
Dysan
2004-12-23 11:55
2005.01.30
глюк SQL сервера или не правильная строка подключения?


1-1106085285
Bobby Digital
2005-01-19 00:54
2005.01.30
RichEdit


1-1105976906
SV
2005-01-17 18:48
2005.01.30
Библиотека для сканирования и распознавания изображения ?


1-1105972236
DimonNew
2005-01-17 17:30
2005.01.30
RichEdit и таблицы