Next: , Previous: Record Representation Clauses, Up: Representation Clauses and Pragmas


8.13 Handling of Records with Holes

As a result of alignment considerations, records may contain "holes" or gaps which do not correspond to the data bits of any of the components. Record representation clauses can also result in holes in records.

GNAT does not attempt to clear these holes, so in record objects, they should be considered to hold undefined rubbish. The generated equality routine just tests components so does not access these undefined bits, and assignment and copy operations may or may not preserve the contents of these holes (for assignments, the holes in the target will in practice contain either the bits that are present in the holes in the source, or the bits that were present in the target before the assignment).

If it is necessary to ensure that holes in records have all zero bits, then record objects for which this initialization is desired should be explicitly set to all zero values using Unchecked_Conversion or address overlays. For example

     type HRec is record
        C : Character;
        I : Integer;
     end record;

On typical machines, integers need to be aligned on a four-byte boundary, resulting in three bytes of undefined rubbish following the 8-bit field for C. To ensure that the hole in a variable of type HRec is set to all zero bits, you could for example do:

     type Base is record
        Dummy1, Dummy2 : Integer := 0;
     end record;
     
     BaseVar : Base;
     RealVar : Hrec;
     for RealVar'Address use BaseVar'Address;

Now the 8-bytes of the value of RealVar start out containing all zero bits. A safer approach is to just define dummy fields, avoiding the holes, as in:

     type HRec is record
        C      : Character;
        Dummy1 : Short_Short_Integer := 0;
        Dummy2 : Short_Short_Integer := 0;
        Dummy3 : Short_Short_Integer := 0;
        I      : Integer;
     end record;

And to make absolutely sure that the intent of this is followed, you can use representation clauses:

     for Hrec use record
        C      at 0 range 0 .. 7;
        Dummy1 at 1 range 0 .. 7;
        Dummy2 at 2 range 0 .. 7;
        Dummy3 at 3 range 0 .. 7;
        I      at 4 range 0 .. 31;
     end record;
     for Hrec'Size use 64;