Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что такое packed array и packed record?


Страницы:   1 2

GrayFace ©   (2005-01-07 09:52:00) 

сабж.


Anatoly Podgoretsky   (2005-01-14 18:40:00) [1]

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


GrayFace   (2005-01-14 18:38:00) [2]

Спасибо.


MBo   (2005-01-14 14:37:00) [3]

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


GrayFace   (2005-01-14 14:30:00) [4]

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

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


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

Понял...


GuAV   (2005-01-08 14:20:00) [6]

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-08 04:04:00) [7]

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


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

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
Годится?


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

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


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

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


Anatoly Podgoretsky   (2005-01-07 17:07:00) [11]

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


PVOzerski   (2005-01-07 16:27:00) [12]

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


GuAV   (2005-01-07 16:26:00) [13]

dimaxx ©   (07.01.05 16:18) [11]

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


dimaxx   (2005-01-07 16:18:00) [14]

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

Пример:

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


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

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

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


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

Касательно 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.


Anatoly Podgoretsky   (2005-01-07 13:36:00) [16]

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

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


Poirot   (2005-01-07 13:24:00) [17]

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


uny   (2005-01-07 11:07:00) [18]

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


KSergey   (2005-01-07 10:59:00) [19]

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

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


Gero   (2005-01-07 10:51:00) [20]


> uny ©   (07.01.05 10:32)

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо