Mega Code Archive

 
Categories / Delphi / Compiler Directives
 

$a - 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 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