Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизЧто такое 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.039 c