Що таке packed array і packed record

Упакований масив і упакована запис.

Ой. Соррі. У довідку не заглянув. Буває ж таке!
Але все-таки уточню: packed array може бути потрібен тільки при зберіганні структур з розміром, що не кратним 4 байтам?

Щодо 4-х байт точно не можу сказати. Краще, ІМХО, при будь-якій структурі явно вказувати packed в тому випадку, якщо явно потрібно незалежність розміру від будь-яких вирівнювань.

> Тільки треба бути впевненим
не радує як то. нехай тоді packed буде

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

Відносно packed array: у мене завжди було таке відчуття, що масиви в Delphi є packed завжди. Ось такий шматочок, прогнаний на D3 і D6, це підтвердив: видав дві п'ятірки. Хоча як в Delphi.Net - не знаю.


var
a: array [1..5] of byte;
b: packed array [1..5] of byte;
initialization
ShowMessage (IntToStr (sizeof (a)) + "" + IntToStr (sizeof (b)));
end.

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

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

Розмір дорівнює 6 байтам незалежно від встановленої опції. Якщо прибрати packed. то розмір буде дорівнює 8 байт.

Якщо опцію вимкнути, то тоді присутність packed взагалі необов'язково.

Теж саме відноситься до масивів.

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

> Теж саме відноситься до масивів.
Велике прохання показати це на прикладі.

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

implementation

type
t5 = packed record
# XA0; 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)));

2 GuAV: Що ти маєш на увазі? Вирівнювання якраз залежить від цієї опції проекту ($ A + або $ ALIGN ON в тексті).

The $ A directive controls alignment of fields in Delphi record types and class structures.
In the or state, fields are never aligned. All record and class structures are packed.
In the state, fields in record types that are declared without the packed modifier and fields in class structures are aligned on word boundaries.
In the 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 or state, fields in record types that are declared without the packed modifier and fields in class structures are aligned on quad word boundaries.

У довідці Integer types
в нижній табличці - фундаментальні типу постійного розміру, у верхній - generic # XA0; - Integer і Cardinal, що відносяться до поточної апаратній платформі.
Ось Integer раніше (в 16-розрядну епоху) був двухбайтное, наприклад.