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 fields are packable (see separate section on pragma
Pack), then the resulting alignment is 1.
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
always specify a larger alignment than the default value, up to some
maximum value dependent on the target (obtainable by using the
The only case where
it is permissible to specify a smaller alignment than the default value
is for a record with a record representation clause.
In this case, packable fields for which a component clause is
given still result in a default alignment corresponding to the original
type, but this may be overridden, since these components in fact only
require an alignment of one byte. For example, given
type V is record A : Integer; end record; for V use record A at 0 range 0 .. 31; 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 since this field is placed with a
component clause, it is permissible, as shown, to override the default
alignment of the record with a smaller value.