Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-1098206789
clampo
2004-10-19 21:26
2005.01.30
Ресурс


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


3-1103649983
dron-s
2004-12-21 20:26
2005.01.30
Общая сумма в DBGrid колонке


1-1106146280
lamo
2005-01-19 17:51
2005.01.30
Ошибка String or Integer


14-1105248541
Чеширский_Кот
2005-01-09 08:29
2005.01.30
MacAfee - параноик!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский