Allocator
Formal Definition
An operation used to create
anonymous, variable objects accessible by means of access values.
Simplified Syntax
new subtype_indication
new qualified_expression
Description
Each time an allocator is
evaluated, a new object is created and the object is designated
(pointed) by an access value (pointer). The type of the object
created by an allocator is defined either by a subtype indication
(example 1 and 2) or a qualified expression (example 3 and 4).
In case of allocators with a subtype indication, the initial value of
the created object is the same as the default initial value of a
directly declared variable of the same subtype (example 1 and 2).
When qualified expression is used, the initial value is defined by
the expression itself (example 3 and 4).
If an allocator creates an object of the array type, then the array
must be constrained. This can be achieved through using a constrained
subtype or specified in the subtype indication with an explicit index
constraint (example 2).
Copying a value of a variable with allocated object to other variable
does not create new object. Instead, both variables point to the same
object (example 5).
See also access type.
Examples
Example 1
type Table is
array (1 to 8) of Natural;
type TableAccess is access Table;
variable y : TableAccess;
...
y := new Table; -- will be
initialized with
-- (0, 0, 0, 0, 0, 0, 0, 0)
The allocator (note that the allocator is of the access type) creates
a new object of the Table type, which is initialized to a default
value, equal in this case to (0, 0, 0, 0, 0, 0, 0, 0).
Example 2
z:= new BIT_VECTOR(1 to 3);
This allocator creates a new object of the BIT_VECTOR type,
consisting of three elements. The default initial value of this
object is equal to ('0','0','0'). Note that the subtype indication is
constrained as the BIT_VECTOR type is unconstrained.
Example 3
type test_record is record
test_time
: time;
test_value
: Bit_Vector (0 to 3);
end record test_record;
type AccTR is
access test_record;
variable x,z : AccTR;
x := new test_record'(30 ns,
B"1100"); -- record allocation with aggregate
z := new test_record;
z.test_time := 30 ns;
z.test_value := B"1100";
Initial values can be assigned to an object (in this case a record)
created by an allocator both using a qualified expression (in this
case with an aggregate - allocator for x) or using a subtype
indication and later on direct assignments (allocator for z). In both
cases above the objects created will be identical (although it will
not be the same object).
Example 4
type AccBV is access
Bit_Vector(7 downto 0);
variable Ptr1, Ptr2 : AccBV;
Ptr1 := new Bit_Vector(7 downto 0);
Ptr2 := Ptr1;
There is no allocator assigned to Ptr2, thus no new object will be
created for it. Instead it will point to the same object, which was
created for Ptr1.
Important Notes
-
For each access type an implicitly declared procedure Deallocate is
defined. The procedure reverses the evaluation of an allocator, i.e.
releases the storage occupied by an object created by an allocator.
-
Allocators (and access types) are not synthesizable.
-
A subtype indication in allocator must not include a resolution function.
-
An object created by an allocator has not its own name (indicator).
Instead, it is referred to through the name, which it was allocated to.
-
The concept of access types and allocators is very much the same as
the concept of pointers in software programming languages.
|