Sign in Join
Wiki copytemporary

Packed/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Packed/ru

OldNewLine
1+## Уплотнение структур
2+
3+Зарезервированное слово **packed** сообщает компилятору по возможности использовать минимальное количество байтов памяти для составных типов данных. Без указания **packed** компилятор может вставить дополнительные неиспользуемые байты между элементами для выравнивания расположения элементов в памяти кратно машинному слову процессора, чтобы ускорить доступ.
4+
5+Кроме экономии памяти, упаковка элементов позволяет избежать несовместимости структур:
6+
7+- при передаче составных типов между разными системами, например, между 32-х и 64-х битными
8+- при обмене данными между программами, собранными разными версиями компиляторов
9+- при подключении библиотек, написанных на других языках программирования
10+
11+> **Warning:** Следует учитывать, что некоторые базовые типы (Integer, Cardinal, Real, Pointer) на разных системах могут иметь разный размер. Поэтому для обмена данными с другими системами используйте только базовые типы с фиксированным размером.
12+
13+Директива [{\$PACKRECORDS n}](https://www.freepascal.org/docs-html/prog/progsu60.html) или [{\$ALIGN n}](https://www.freepascal.org/docs-html/prog/progsu1.html) задает размер в байтах для выравнивания элементов структур, для которых не указан определитель **packed**.
14+
15+{\$PACKRECORDS 1} эквивалентно указанию **packed**.
16+
17+Пример:\
18+
19+``` pascal
20+ type TPArray = packed array [1..9] of LongInt;
21+ type TPClass = packed class ... end;
22+ type TPObject = packed object ... end;
23+ type TPRecord = packed record ... end;
24+```
25+
26+## Битовое уплотнение
27+
28+Директива [{\$BITPACKING ON\|OFF}](https://www.freepascal.org/docs-html/prog/progsu6.html) указывает компилятору, что он должен уплотнять элементы до минимального размера в битах. Если значение ON, то компилятор будет уплотнять побитно структуры, имеющие ключевое слово **packed**.
29+
30+Ключевое слово **bitpacked** указывает, что элементы составного типа должны уплотнятся побитно независимо от значения директивы {\$BITPACKING}.
31+
32+Пример:\
33+
34+``` pascal
35+type TSomeBitLevelStructure = bitpacked record
36+ SingleBit: Boolean;
37+ OneBit: 0..1;
38+ TwoBits: 0..3;
39+ FourBits: 0..15;
40+ EightBits: 0..255
41+end;
42+```
43+
44+## Смотри также
45+
46+- Процедуры [pack()](https://www.freepascal.org/docs-html/rtl/system/pack.html) и [unpack()](https://www.freepascal.org/docs-html/rtl/system/unpack.html)
47+- [Упаковка и распаковка массивов](https://www.freepascal.org/docs-html/ref/refse14.html#QQ2-38-60)
48+
49+---
50+*From the Free Pascal wiki, page "Packed/ru", as it stood on 2020-02-23 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history