If I wrote
type u1 is range 0 .. 1;
type Index is range 0 .. 499999;
type U1Array is array(Index) of u1;
can I assume, that this will be a bit vector, which is packing the single u1 instances efficiently? I.e. 8 Bits/Byte?
Better to check than to assume. One can check the representation of a data type using -gnatR2
(see here). A quick check below shows that U1Array
will not be a bit vector. The size of its components will be 8 [bits], its total size will be 4,000,000 [bits].
To have it as a bit vector, you need to make it a "packed" array (see RM 13.2). The size of the packed array will be 500,000 [bits]. The size of its components will be 1 [bit].
foo.ads
package Foo is
type u1 is range 0 .. 1;
type Index is range 0 .. 499999;
type U1Array is array(Index) of u1;
type U1PackedArray is array(Index) of u1 with Pack;
end Foo;
output
$ gcc -c foo.ads -gnatR2
Representation information for unit Foo (spec)
----------------------------------------------
for U1'Object_Size use 8;
for U1'Value_Size use 1;
for U1'Alignment use 1;
for Index'Object_Size use 32;
for Index'Value_Size use 19;
for Index'Alignment use 4;
for U1array'Size use 4000000;
for U1array'Alignment use 1;
for U1array'Component_Size use 8;
for U1packedarray'Size use 500000;
for U1packedarray'Alignment use 1;
for U1packedarray'Component_Size use 1;