Главная страница
    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
14-1105187781
speed
2005-01-08 15:36
2005.01.30
Сертификация...


3-1104155962
Артемиус
2004-12-27 16:59
2005.01.30
Как определить количество и имена таблиц в базе?


3-1103727399
Larisa
2004-12-22 17:56
2005.01.30
Можно ли использовать для доступа к данным компоненты


3-1103977626
Varfolomey
2004-12-25 15:27
2005.01.30
InterBase 6.0: BLOB


3-1103721736
Andrej
2004-12-22 16:22
2005.01.30
исключения в IB & try...except





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский