Difference between revisions of "Packed/ru"

From Free Pascal wiki
Jump to navigationJump to search
(Created page with "{{packed}} Зарезервированное слово '''packed''' сообщает компилятору по возможности использовать миним...")
 
(improved, mentioned good practice and bitpacking)
Line 1: Line 1:
 
{{packed}}
 
{{packed}}
  
Зарезервированное слово '''packed''' сообщает компилятору по возможности использовать минимальное количество памяти для сложных типов данных. Без указания '''packed''' компилятор может вставить дополнительные неиспользуемые байты между элементами последовательности для выравнивания данных по границам полных машинных слов для ускорения доступа процессором. Таким образом, при упаковке данных приходится жертвовать некоторой скоростью, но экономить используемую память.
+
== Уплотнение структур ==
  
 +
Зарезервированное слово '''packed''' сообщает компилятору по возможности использовать минимальное количество байтов памяти для составных типов данных. Без указания '''packed''' компилятор может вставить дополнительные неиспользуемые байты между элементами для выравнивания расположения элементов в памяти кратно машинному слову процессора, чтобы ускорить доступ.
  
 +
Кроме экономии памяти, упаковка элементов позволяет избежать несовместимости структур:
 +
* при передаче составных типов между разными системами, например, между 32-х и 64-х битными
 +
* при обмене данными между программами, собранными разными версиями компиляторов
 +
* при подключении библиотек, написанных на других языках программирования
 +
 +
{{Warning|Следует учитывать, что некоторые базовые типы (Integer, Cardinal, Real, Pointer) на разных системах могут иметь разный размер. Поэтому для обмена данными с другими системами используйте только базовые типы с фиксированным размером.}}
 +
 +
Директива [https://www.freepascal.org/docs-html/prog/progsu60.html {$PACKRECORDS n}] или [https://www.freepascal.org/docs-html/prog/progsu1.html {$ALIGN n}] задает размер в байтах для выравнивания элементов структур, для которых не указан определитель '''packed'''.
 +
 +
{$PACKRECORDS 1} эквивалентно указанию '''packed'''.
  
 
Пример:<br>
 
Пример:<br>
 
<syntaxhighlight>
 
<syntaxhighlight>
   type TPArray = Packed array[1 .. 9] of longint ;
+
   type TPArray = packed array [1..9] of LongInt;
   type TPClass = Packed class  ... end;
+
   type TPClass = packed class  ... end;
   type TPObject = Packed object ... end;
+
   type TPObject = packed object ... end;
   type TPRecord = Packed record ... end;
+
   type TPRecord = packed record ... end;
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
== Битовое уплотнение ==
 +
 +
Директива [https://www.freepascal.org/docs-html/prog/progsu6.html {$BITPACKING ON|OFF}] указывает компилятору, что он должен уплотнять элементы до минимального размера в битах. Если значение ON, то компилятор будет уплотнять побитно структуры, имеющие ключевое слово '''packed'''.
 +
 +
Ключевое слово '''bitpacked''' указывает, что элементы составного типа должны уплотнятся побитно независимо от значения директивы {$BITPACKING}.
 +
 +
Пример:<br>
 +
<syntaxhighlight>
 +
type TSomeBitLevelStructure = bitpacked record
 +
  SingleBit: Boolean;
 +
  OneBit: 0..1;
 +
  TwoBits: 0..3;
 +
  FourBits: 0..15;
 +
  EightBits: 0..255
 +
end;
 +
</syntaxhighlight>
 +
 +
== Смотри также ==
 +
* Процедуры [https://www.freepascal.org/docs-html/rtl/system/pack.html pack()] и [https://www.freepascal.org/docs-html/rtl/system/unpack.html unpack()]
 +
* [https://www.freepascal.org/docs-html/ref/refse14.html#QQ2-38-60 Упаковка и распаковка массивов]

Revision as of 10:26, 2 August 2018

Deutsch (de) English (en) русский (ru)

Уплотнение структур

Зарезервированное слово packed сообщает компилятору по возможности использовать минимальное количество байтов памяти для составных типов данных. Без указания packed компилятор может вставить дополнительные неиспользуемые байты между элементами для выравнивания расположения элементов в памяти кратно машинному слову процессора, чтобы ускорить доступ.

Кроме экономии памяти, упаковка элементов позволяет избежать несовместимости структур:

  • при передаче составных типов между разными системами, например, между 32-х и 64-х битными
  • при обмене данными между программами, собранными разными версиями компиляторов
  • при подключении библиотек, написанных на других языках программирования
Warning-icon.png

Предупреждение: Следует учитывать, что некоторые базовые типы (Integer, Cardinal, Real, Pointer) на разных системах могут иметь разный размер. Поэтому для обмена данными с другими системами используйте только базовые типы с фиксированным размером.

Директива {$PACKRECORDS n} или {$ALIGN n} задает размер в байтах для выравнивания элементов структур, для которых не указан определитель packed.

{$PACKRECORDS 1} эквивалентно указанию packed.

Пример:

  type TPArray = packed array [1..9] of LongInt;
  type TPClass = packed class  ... end;
  type TPObject = packed object ... end;
  type TPRecord = packed record ... end;

Битовое уплотнение

Директива {$BITPACKING ON|OFF} указывает компилятору, что он должен уплотнять элементы до минимального размера в битах. Если значение ON, то компилятор будет уплотнять побитно структуры, имеющие ключевое слово packed.

Ключевое слово bitpacked указывает, что элементы составного типа должны уплотнятся побитно независимо от значения директивы {$BITPACKING}.

Пример:

type TSomeBitLevelStructure = bitpacked record
  SingleBit: Boolean;
  OneBit: 0..1;
  TwoBits: 0..3;
  FourBits: 0..15;
  EightBits: 0..255
end;

Смотри также