$Align
Belongs to : Compiler DirectivesDescription
The $Align compiler directive determines whether Delphi aligns data, or whether it packs the data into the smallest space.
With $Align On (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 2 byte boundary.
With $Align On, the default value, you can override this setting with the packed option for complex data structures.
These alignments ensure optimal access performance.
$Align Off 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 $Align On
Example code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
type // Use the default setting : $Align+ // 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 {$Align Off} // 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; //The result will be // Aligned record size = 20 // Packed record size = 14 // UnPacked record size = 14 |