Упакованные структурированные типы

На верх  Назад  Вперёд

После объявления структурированного типа, не нужно делать никаких предположений о внутреннем размещении элементов в типе. Компилятор разместит элементы структуры в памяти, так как по его мнению, будет самым подходящим. Таким образом, порядок элементов будет сохранен, но расположение элементов не гарантируются, и частично управляется директивой $PACKRECORDS (эта директива объяснена в Справочник программиста Free Pascal).

Тем не менее, Free Pascal позволяет контролировать размещение с помощью ключевых слов Packed и Bitpacked. Смысл этих ключевых слов зависит от контекста:

Bitpacked
В этом случае компилятор попытается выровнять перечислимые типы на разрядных границах, как объяснено ниже.

Packed
Значение ключевого слова Packed зависит от ситуации:

1.В режиме MACPAS оно эквивалентно ключевому слову Bitpacked.

2.В других режимах, с включенной директивой $BITPACKING, оно также эквивалентно ключевому слову Bitpacked.

3.В других режимах, с выключенной директивой $BITPACKING, оно означает нормальную упаковку на границах байтов.

Упаковка на границах байта означает, что каждый новый элемент структурированного типа начинается на границе байта.

Механизм байт-упаковки прост: компилятор выравнивает каждый элемент структуры на первой доступной границе байта, даже если размер предыдущего элемента (небольшие перечислимые типы, типы под диапазоны) является меньше чем байт.

При использовании механизма битовой упаковки компилятор для каждого перечислимого типа  вычисляет, количество битов необходимых для его размещения. Следующий указанный тип будет размещен начиная со следующего свободного бита.

Не перечислимые типы - которые включают, но не ограничены - множествами, вещественными числами, строками, (побитно упакованными) записями, (побитно упакованными) массивами, указателями, классами, объектами, и процедурными переменными, выравниваются на первой доступной границе байта.

Отметьте, что внутреннее представление побитовой упаковки непрозрачно: в будущем оно может измениться в любое время. Более того: внутренняя упаковка зависит от порядка байтов на платформе, для которой производилась компиляция, и никакое преобразование между платформами не возможно. Это делает побитно упакованные структуры неподходящими для сохранения на диск или передачу через сеть. Однако используется тот же формат что,и в Компиляторе Pascal GNU, и команда Free Pascal стремится сохранять эту совместимость в будущем.

Есть еще некоторые ограничения на элементы побитно упакованных структур:

Адрес не может быть получен, если размер в битах не кратен числу 8, и элемент, не выровнен на границе байта.

Элемент побитно упакованной структуры не может использоваться в качестве var-параметра, если его размер в битах не кратен числу 8, и элемент, не выровнен на границе байта.

Для определения размера элемента в побитно упакованной структуре, используется функция BitSizeOf. Она возвращает размер элемента - в битах. Для других типов или элементов структур, которые не упакованы побитно, она просто возвратит размер в байтах, умноженных на 8, то есть, возвращаемое значение равное 8*SizeOf.

Размер побитно упакованных записей и массивов ограничен:

На 32-х битных системах максимальный размер составляет 229 байтов (512 MB).

На 64-х битных системах максимальный размер составляет 261 байтов.

Причина такого ограничения состоит в том, что смещение элемента должно быть вычислено с помощью максимально большого целочисленного типа в данной системе.