DelphiBasics
$A
Compiler Directive
Determines whether data is aligned or packed
1   {$A-}
2   {$A+}
Description
The $A compiler directive determines whether Delphi aligns data, or whether it packs the data into the smallest space.
 
With $A+ (default), complex data types, such as records have their elements aligned to 2, 4 or 8 byte boundaries, as appropriate to the data type. For example, a Word field would be aligned to a 4 byte boundary.
 
With $A+, the default value, you can override this setting with the packed option for complex data structures.
 
These alignments ensure optimal access performance.
 
$A- tells Delphi to ignore alignment, and thereby pack data.
Notes
Examples of unpacked alignments :

Word     = 2 bytes

LongWord = 4 bytes

Single   = 4 bytes

Double   = 8 bytes

$Align is equivalent to $A.

This directive can be used multiple times within your code.

The default value is $A+
Related commands
$Align Determines whether data is aligned or packed
Packed Compacts complex data types into minimal storage
 Author links

 Download this web site as a Windows program.





 
Example code : Packing a record to reduce storage
type
  // Use the default setting : $A+
  // Declare an unpacked, aligned record
  TAlignedRecord = Record
    name1   : string[4];
    floater : single;
    name2   : char;
    int     : Integer;
  end;

  // Declare a packed record
  TPackedRecord = Packed Record
    name1   : string[4];
    floater : single;
    name2   : char;
    int     : Integer;
  end;

  // Set alignment off
  {$A-}

  // Declare an unpacked record
  // This will get treated as if packed was on
  TUnPackedRecord = Record
    name1   : string[4];
    floater : single;
    name2   : char;
    int     : Integer;
  end;

var
  alignedRec  : TAlignedRecord;
  packedRec   : TPackedRecord;
  unPackedRec : TUnPackedRecord;

begin
  ShowMessage('Aligned record size = '+IntToStr(SizeOf(alignedRec)));
  ShowMessage('Packed record size = '+IntToStr(SizeOf(packedRec)));
  ShowMessage('UnPacked record size = '+IntToStr(SizeOf(unPackedRec)));
end;
Show full unit code
   Aligned record size = 20
   Packed record size = 14
   UnPacked record size = 14
 
Delphi Programming Neil Moffatt 2002 - 2020. All rights reserved.  |  Home Page