Справочник Ada 2012
13.11.3 Стандартные пулы памяти
Предикат и аспект Default_Storage_Pool задают пул памяти, который будет использоваться по умолчанию в отсутствие явного указания пула памяти или размера памяти для типа доступа.
Синтаксис
Форма предиката Default_Storage_Pool выглядит следующим образом:
pragma Default_Storage_Pool (storage_pool_indicator);
Предикат Default_Storage_Pool может быть использован непосредственно в видимой части спецификации пакета package_specification, непосредственно в части объявления declarative_part или как конфигурационный предикат.
Правила разрешения имен
Ожидается, что имя_пула_памяти будет иметь тип Root_Storage_Pool'Class.
Правила легитимности
имя_пула_памяти должно обозначать переменную.
Стандартный storage_pool_indicator Standard — это идентификатор, специфичный для предиката (см. 2.8), и не обозначает никакую декларацию. Если storage_pool_indicator равен Standard, то не должно быть декларации с defining_identifier Standard, видимой в момент указания предиката, кроме самого пакета Standard.
Если предикат используется как конфигурационный предикат, storage_pool_indicator должен быть либо null, либо Standard, и он определяет пул по умолчанию как указанный storage_pool_indicator во всех применимых единицах компиляции (см. 10.1.5), за исключением непосредственного охвата другого предиката Default_Storage_Pool. В противном случае предикат находится непосредственно в последовательности деклараций, и он определяет пул по умолчанию в непосредственном охват предиката как указанный storage_pool_indicator, за исключением непосредственного охвата последующего предиката Default_Storage_Pool. Таким образом, внутренний предикат переопределяет внешний.
Предикат Default_Storage_Pool не должен использоваться как конфигурационный предикат, применяемый к единице компиляции, которая находится в непосредственном объеме действия другого предиката Default_Storage_Pool.
Статические семантика
Определяемый языком аспект Default_Storage_Pool может быть задан для порожденного экземпляра; он определяет пул по умолчанию для типов доступа внутри экземпляра. .
Аспект Default_Storage_Pool может быть задан как Standard, что является идентификатором, специфичным для аспекта (см. 13.1.1) и определяет пул по умолчанию как Standard. В этом случае не должно быть декларации с defining_identifier Standard, которая непосредственно видна в момент задания аспекта, кроме самого пакета Standard.
В противном случае ожидаемый тип для аспекта Default_Storage_Pool — Root_Storage_Pool'Class, а aspect_definition должен быть именем, обозначающим переменную. Этот аспект переопределяет любой предикат Default_Storage_Pool, который может применяться к генерическому блоку; если аспект не задан, пул по умолчанию экземпляра — тот, что определен для генерического блока.
Эффект задания аспекта Default_Storage_Pool для экземпляра определенного языком генерического блока — определяется реализацией.
Для непроизводных типов доступа, объявленных в местах, где пул по умолчанию определяется предикатом или аспектом, их атрибуты Storage_Pool или Storage_Size определяются следующим образом, если Storage_Pool или Storage_Size не указаны для типа:
- Если пул по умолчанию null, атрибут Storage_Size по умолчанию равен нулю. Таким образом, оператор выделения памяти для такого типа недопустим.
- Если пул по умолчанию ни null, ни Standard, то атрибут Storage_Pool — это данный пул.
В противном случае (включая случай, когда пул по умолчанию задан как Standard), используется стандартный пул памяти для типа, как описано в 13.11.
Этот абзац был удален.
Разрешения для реализации
Объект, созданный оператором выделения памяти, который передаётся в качестве фактического параметра в параметр доступа, может быть размещён в стеке и автоматически удалён независимо от пула по умолчанию.
ПРИМЕЧАНИЯ
32 Default_Storage_Pool может использоваться с ограничениями No_Coextensions и No_Access_Parameter_Allocators (см. H.4), чтобы гарантировать, что все операторы выделения памяти используют пул по умолчанию.