Spec-Zone.ru › Ada 2005
Справочник по Ada 2005

13.5.1 Описания представления записей

Определение record_representation_clause определяет представление записей и расширений записей в памяти, то есть порядок, положение и размер компонентов (включая, при необходимости, дискриминанты).

Синтаксис

record_representation_clause ::=
for first_subtype_local_name use
record [mod_clause]
{component_clause}
end record;
component_clause ::=
component_local_name at position range first_bit .. last_bit;
position ::= static_expression
first_bit ::= static_simple_expression
last_bit ::= static_simple_expression

Правила разрешения имён

Каждое значение position, first_bit и last_bit ожидается любого целочисленного типа.

Правила легальности

first_subtype_local_name в record_representation_clause должен обозначать конкретный тип записи или подтип расширения записи.
Если component_local_name является direct_name, то local_name должен обозначать компонент типа. Для расширения записи компонент не должен наследоваться и не должен быть дискриминантой, соответствующей дискриминанте родительского типа. Если у component_local_name есть attribute_designator, то direct_name local_name должен обозначать либо объявление типа, либо компонент типа, а attribute_designator должен обозначать определённый реализацией неявный компонент типа.
Значения position, first_bit и last_bit должны быть статическими выражениями. Значения position и first_bit должны быть неотрицательными. Значение last_bit должно быть не меньше first_bit – 1.
Если для типа применяется нестандартный порядок бит, то выполняется одно из условий:
  • значение last_bit должно быть меньше размера самого большого машинного скаляра; или
  • значение first_bit должно быть нулём, а значение last_bit + 1 должно быть кратным System.Storage_Unit.
Для каждого компонента типа, включая каждый дискриминант, допускается не более одного component_clause (могут быть указаны component_clause для некоторых, всех или ни одного компонента). Места хранения внутри component_list не должны перекрываться, если они не относятся к компонентам в различных variant тех же variant_part.
Имя, обозначающее компонент типа, запрещено в record_representation_clause для типа, за исключением использования его как component_local_name в component_clause.

Статическая семантика

record_representation_clause (без mod_clause) определяет расположение.
Если для типа применяется стандартный порядок бит, то position, first_bit и last_bit каждого component_clause непосредственно определяют положение и размер соответствующего компонента.
Если применяется нестандартный порядок бит, то расположение определяется следующим образом:
  • component_clause с last_bit больше или равно размеру наибольшего машинного скаляра непосредственно определяют положение и размер соответствующего компонента;
  • для других component_clause все компоненты с одинаковым значением position рассматриваются как часть одного машинного скаляра, расположенного в этом положении; размер этого машинного скаляра — наименьший размер машинного скаляра, больший, чем наибольшее last_bit для всех component_clause в этом положении; first_bit и last_bit каждого component_clause затем интерпретируются как битовые смещения в этом машинном скаляре.
record_representation_clause для расширения записи не переопределяет расположение родительской части; если расположение было указано для родительского типа, оно наследуется расширением записи.

Разрешения реализации

Реализация может генерировать компоненты с определёнными реализацией значениями (например, один, содержащий смещение другого компонента). Реализация может генерировать имена, обозначающие такие компоненты с определёнными реализацией значениями; такие имена должны быть ссылочными выражениями с определёнными реализацией значениями attribute_reference. Реализация может разрешить использование таких ссылочных выражений в record_representation_clause. Реализация может ограничить такие component_clause любым способом.
Если record_representation_clause указан для не помеченного типа, производного от другого, атрибуты места хранения для всех компонентов производного типа могут отличаться от соответствующих компонентов родительского типа, даже для компонентов, чьё место хранения не указано явно в record_representation_clause.

Рекомендации для реализации

Рекомендуемый уровень поддержки record_representation_clause:
  • Реализация должна поддерживать машинные скаляры, соответствующие всем форматам целых, чисел с плавающей запятой и адресов, поддерживаемым машиной.
  • Реализация должна поддерживать места хранения, которые могут быть извлечены с помощью последовательности машинных команд загрузки, маскирования, сдвига и установлены с помощью последовательности машинных команд загрузки, сдвига, маскирования, сохранения, с учётом доступных машинных инструкций и модели выполнения.
  • Место хранения должно быть поддержано, если его размер равен размеру подтипа компонента, и оно начинается и заканчивается на границе, соответствующей выравниванию подтипа компонента.
  • Для компонента с подтипом, размер которого меньше размера слова, должна поддерживаться любая область хранения, которая не пересекает выровненную границу слова.
  • Реализация может зарезервировать область хранения для поля тега помеченного типа и запретить другим компонентам перекрывать эту область.
  • Реализация не обязана поддерживать component_clause для компонента части расширения, если область хранения не следует за областями хранения всех компонентов родительского типа, независимо от того, были ли эти области хранения указаны.
ПРИМЕЧАНИЯ
11 Если для компонента не указан component_clause, то выбор области хранения для компонента предоставляется реализации. Если component_clause указаны для всех компонентов, то record_representation_clause полностью определяет представление типа и будет точно соблюдаться реализацией.

Примеры

Пример указания макета типа записи:
Word : constant := 4; -- элемент хранения – байт, 4 байта на слово
type State is (A,M,W,P);
type Mode is (Fix, Dec, Exp, Signif);
type Byte_Mask is array (0..7) of Boolean;
type State_Mask is array (State) of Boolean;
type Mode_Mask is array (Mode) of Boolean;
type Program_Status_Word is
record
System_Mask : Byte_Mask;
Protection_Key : Integer range 0 .. 3;
Machine_State : State_Mask;
Interrupt_Cause : Interruption_Code;
Ilc : Integer range 0 .. 3;
Cc : Integer range 0 .. 3;
Program_Mask : Mode_Mask;
Inst_Address : Address;
end record;
for Program_Status_Word use
record
System_Mask at 0*Word range 0 .. 7;
Protection_Key at 0*Word range 10 .. 11; -- биты 8,9 не используются
Machine_State at 0*Word range 12 .. 15;
Interrupt_Cause at 0*Word range 16 .. 31;
Ilc at 1*Word range 0 .. 1; -- второе слово
Cc at 1*Word range 2 .. 3;
Program_Mask at 1*Word range 4 .. 7;
Inst_Address at 1*Word range 8 .. 31;
end record;
for Program_Status_Word'Size use 8*System.Storage_Unit;
for Program_Status_Word'Alignment use 8;
ПРИМЕЧАНИЯ
12 Примечание к примеру: record_representation_clause определяет макет записи. Оператор Size гарантирует, что (по крайней мере) восемь элементов хранения используются для объектов типа. Оператор Alignment гарантирует, что адреса связанных, импортированных или экспортированных объектов типа будут кратны восьми.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API