GNAT requires that all alignment clauses specify a power of 2, and all default alignments are always a power of 2. The default alignment values are as follows:
Storage_Unit, and the maximum alignment supported by the target. (This maximum alignment is given by the GNAT-specific attribute
Standard'Maximum_Alignment; see Maximum_Alignment.) For example, for type
Long_Float, the object size is 8 bytes, and the default alignment will be 8 on any target that supports alignments this large, but on some targets, the maximum alignment may be smaller than 8, in which case objects of type
Long_Floatwill be maximally aligned.
Packis used and all components are packable (see separate section on pragma
Pack), then the resulting alignment is 1, unless the layout of the record makes it profitable to increase it.
A special case is when:
type Small is record A, B : Character; end record; for Small'Size use 16;
then the default alignment of the record type
Small is 2, not 1. This
leads to more efficient code when the record is treated as a unit, and also
allows the type to specified as
Atomic on architectures requiring
An alignment clause may specify a larger alignment than the default value
up to some maximum value dependent on the target (obtainable by using the
Standard'Maximum_Alignment). It may also specify
a smaller alignment than the default value for enumeration, integer and
fixed point types, as well as for record types, for example
type V is record A : Integer; end record; for V'alignment use 1;
The default alignment for the type
V is 4, as a result of the
Integer field in the record, but it is permissible, as shown, to
override the default alignment of the record with a smaller value.