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