![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что такое packed array и packed record?
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.