Node: Storage_Size Clauses, Next: Size of Variant Record Objects, Previous: Size Clauses, Up: Representation Clauses and Pragmas
For tasks, the Storage_Size
clause specifies the amount of space
to be allocated for the task stack. This cannot be extended, and if the
stack is exhausted, then Storage_Error
will be raised if stack
checking is enabled. If the default size of 20K bytes is insufficient,
then you need to use a Storage_Size
attribute definition clause,
or a Storage_Size
pragma in the task definition to set the
appropriate required size. A useful technique is to include in every
task definition a pragma of the form:
pragma Storage_Size (Default_Stack_Size);
Then Default_Stack_Size can be defined in a global package, and modified as required. Any tasks requiring different task stack sizes from the default can have an appropriate alternative reference in the pragma.
For access types, the Storage_Size
clause specifies the maximum
space available for allocation of objects of the type. If this space is
exceeded then Storage_Error
will be raised by an allocation attempt.
In the case where the access type is declared local to a subprogram, the
use of a Storage_Size
clause triggers automatic use of a special
predefined storage pool (System.Pool_Size
) that ensures that all
space for the pool is automatically reclaimed on exit from the scope in
which the type is declared.
A special case recognized by the compiler is the specification of a
Storage_Size
of zero for an access type. This means that no
items can be allocated from the pool, and this is recognized at compile
time, and all the overhead normally associated with maintaining a fixed
size storage pool is eliminated. Consider the following example:
procedure p is type R is array (Natural) of Character; type P is access all R; for P'Storage_Size use 0; -- Above access type intended only for interfacing purposes y : P; procedure g (m : P); pragma Import (C, g); -- ... begin -- ... y := new R; end;
As indicated in this example, these dummy storage pools are often useful in connection with interfacing where no object will ever be allocated. If you compile the above example, you get the warning:
p.adb:16:09: warning: allocation from empty storage pool p.adb:16:09: warning: Storage_Error will be raised at run time
Of course in practice, there will not be any explicit allocators in the case of such an access declaration.