13.2. СПЕЦИФИКАТОРЫ ДЛИНЫ

Спецификатор длины задает объем памяти:

спецификатор длины ::= for атрибут use простое-выражение;

Выражение должно быть некоторого числового типа; оно вычисляется, при пред выполнении спецификатора длины (кроме случая, когда оно является статическим). Префикс атрибута должен обозначать либо тип, либо первый именованный подтип. Далее этот префикс обозначается буквой Т. В спецификаторе длины в качестве обозначений атрибутов допустимы только SIZE, STORAGE_SIZE и SMALL. Результат применения спецификатора длины зависит от обозначения атрибута.

а) Спецификация размера: Т'SIZE

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

Спецификация размера допустима, только если ограничения на Т и его компоненты (если они есть) являются статическими. Для неограниченного индексируемого типа статическими должны быть также подтипы индексов.

б) Спецификация размера набора: T'STORAGE_SIZE

Префикс Т должен обозначать ссылочный тип. Выражение должно быть некоторого целого типа (но не обязательно статическим); его значение определяет число квантов памяти, выделяемых для набора, т.е. объем памяти, необходимый для размещения всех объектов, указанных значениями ссылочного типа и значениями других типов, непосредственно или косвенно производных от ссылочного типа. Эта форма спецификатора длины недопустима для типа, производного от ссылочного типа.

в) Спецификация объема памяти для активизации задачи: T'STORAGE_SIZE

Префикс Т должен обозначать задачный тип. Выражение должно быть некоторого целого типа (но не обязательно статическим); его значение определяет число квантов памяти, выделяемых для активизации (но не для кода) задачи данного типа.

г) Спецификация наименьшего для фиксированных типов: Т'SMALL

Префикс Т должен обозначать первый именованный подтип фиксированного типа. Выражение должно быть статическим некоторого вещественного типа; его значение должно быть не больше, чем дельта этого первого поименованного подтипа. Результат применения спецификатора длины — использование этого наименьшего значения для представления значений фиксированного базового типа. (Спецификатор длины, таким образом, также влияет на выделенный для объектов этого типа объем памяти.)

Примечание. Спецификация размера допустима для ссылочного, задачного или фиксированного типов независимо от того, задана или нет для такого типа какая-либо другая форма спецификатора длины.

От реализации зависит, чтб понимается под резервированием части памяти для набора или активизации задачи. Поэтому управление с помощью спецификаторов длины зависит от соглашений в реализации. Например, в языке не определено, включается ли в память, выделяемую для активизации задачи память, необходимая для размещения набора, сопоставленного ссылочному типу и описанному в теле задачи. Метод распределения памяти под объекты, обозначенные значениями ссылочного типа, также не определяется. Например, место может выделяться в стеке; можно использовать схему настраиваемого динамического распределения памяти, или память может быть зафиксирована.

Размещенные объекты набора не обязаны занимать одинаковые размеры памяти, если указанный тип — это неограниченный индексируемый тип или неограниченный тип с дискриминантами. Заметим также, что сам генератор может требовать некоторый объем памяти для размещения внутренних таблиц и связей. Следовательно, спецификатор длины для набора ссылочного типа не всегда позволяет точно управлять максимальным числом генерируемых объектов.

Примеры:

-- предполагаемые описания:type MEDIUM is range 0 .. 65000;type SHORT  is delta  0.01 range -100.0 .. 100.0;type DEGREE is delta  0.1   range -360.0 .. 360.0;BYTE : constant := 8;PAGE : constant := 2000;-- спецификаторы длины:for COLOR'SIZE   use UBYTE; -— см. 3.5.1 for MEDIUM'SIZE  use 2*BYTE;for SHORT'SIZE   use 15;for CAR_NAME'STORAGE_SIZE use -- примерно 2000 машин    2000*((CAR'SIZE/SYSTEM.STORAGE_UNIT) +1);for KEYBOARD_DRIVER_STORAGE_SIZE use 1*PAGE;for DEGREE'SMALL use 360.0/2**(SYSTEM.STORAGE_UNIT - 1);

Примечание к примерам. В спецификаторе длины для SHORT минимально необходимы пятнадцать разрядов, так как определение типа требует SHORT'SMALL = 2.0**(-7) и SHORT'MANTISSA = 14. Спецификатор длины для DEGREE вводит модельные числа, которые занимают в точности весь диапазон типа.

Ссылки: активизация задачи 9.3, атрибут 4.1.4, вещественный тип 3.5.5, выражение 4.4, вычисление 4.5, генератор 4.8, дельта фиксированного типа 3.5.9, должен 1.6, допустим 1.6, задача 9, задачный тип 9.1, именуемый тип 3.7, индексируемый тип 3.6, квант памяти 13.7, подкомпонента 3.3, набор 3.8, наименьшее фиксированного типа 3.5.10, неограниченный индексируемый тип 3.6, объект 3.2, ограничение 3.3, пакет SYSTEM 13.7, первый именованный подтип 13.1, подтип индекса 3.6, понятие 3.1, предвыполнение 3.9, производный тип 3.4, составной тип 3.3, спецификация задачи 9.1, ссылочный тип 3.8, статический подтип 4.9, статическое выражение 4.9, статическое ограничение 4.9, тип 3.3, указывать 3.8, фиксированный тип 3.5.9, целый тип 3.5.4, числовой тип 3.5.