Jump to content

Ada Programming/Attributes/'Size

From Wikibooks, open books for an open world

Ada. Time-tested, safe and secure.
Ada. Time-tested, safe and secure.

Description

[edit | edit source]

R'Size is a representation attribute used to get the number of bits of an object or type:

  • When applied to an object, 'Size yields the actual number of bits allocated to store the object.
  • When applied to a subtype, 'Size yields the smallest n such that all values fit in the range 0 .. 2n-1 for only positive values, else -2n-1 .. 2n-1-1.

The 'Size attribute may also be used in an attribute definition clause to set the size for a first subtype. In special cases, it is even possible to force a biased representation by using a smaller value than the n above.

Examples

[edit | edit source]

This subtype allows a biased representation with only three bits because it comprises only eight values:

 type T is range 1000 .. 1007;
 for  T'Size use 3;

Without the size clause, T'Size would return 10 because 210-1 = 1023.

File: attributes_size.adb (view, plain text, download page, browse all)
with Ada.Text_IO;

procedure Attributes_Size is

   package T_IO renames Ada.Text_IO;
   package I_IO is new  Ada.Text_IO.Integer_IO (Integer);

   A_Boolean : constant Boolean := True;
begin
   T_IO.Put ("Size of Boolean type   = "); -- An enumeration with
   I_IO.Put (Boolean'Size);                -- 2 values fits into
   T_IO.New_Line;                          -- 1 bit.

   T_IO.Put ("Size of Boolean Object = "); -- it is more efficient
   I_IO.Put (A_Boolean'Size);              -- to store a boolean
   T_IO.New_Line;                          -- as an entire byte
end Attributes_Size;

The output with GNAT 10.2.0 will be:

Size of Boolean type   =           1
Size of Boolean Object =           8

Try it yourself and see how your compiler does.

The value of Size can also be specified using an attribute definition clause. For example, the following declarations specify a C99 compatible bool:

type Bool is new Boolean; 
for Bool'Size use Interfaces.C.int'Size;

Incorrect usages

[edit | edit source]

A common Ada programming mistake is to assume that specifying 'Size for a type T forces the compiler to allocate exactly this number of bits for objects of this type. This is not true. The specified T'Size will force the compiler to use this size for components in packed arrays and records and in Unchecked_Conversion, but the compiler is still free to allocate more bits for stand-alone objects.

Use 'Size on the object itself to force the object to the specified value.

See also

[edit | edit source]

Wikibook

[edit | edit source]

Ada 83 Reference Manual

[edit | edit source]

Ada 95 Reference Manual

[edit | edit source]

Ada 2005 Reference Manual

[edit | edit source]

Ada 2012 Reference Manual

[edit | edit source]