Structure packing/field alignment

FreeBASIC

Structure packing/field alignment
 
The default layout of Type and Union structures in FreeBASIC is compatible to that of GCC, following the SysV (Linux/BSD) and Microsoft (Windows) ABIs. This allows for binary compatibility with GCC and other compilers.

By default, fields are aligned to their natural boundaries, which are:
  • A multiple of 1 for 1-byte data types
  • A multiple of 2 for 2-byte data types
  • A multiple of 4 for 4-byte data types
  • A multiple of 4 for 8-byte data types (32bit x86 DOS(DJGPP)/Linux/BSD)
  • A multiple of 8 for 8-byte data types (Win32/Win64, 32bit ARM Linux, 64bit x86_64/AArch64 Linux/BSD)
  • The largest natural boundary of the fields of Type/Union data types
  • Dynamic string descriptors are handled as Type structures with the data pointer field being the one with the largest natural alignment.
  • Fixed-length strings are aligned according to the alignment required for the character size.
  • Static arrays are aligned according to the alignment required for the element data type.

The compiler aligns fields by inserting padding bytes in front of them in order to move them to an offset that corresponds to their natural boundary, or to a multiple of the value given with Field = N, if it is smaller than the field's natural alignment. On the x86 architecture, such proper alignment is not required but can result in better performance when accessing the fields. Other architectures might actually require proper alignment.

In addition to field alignment, the whole structure's size is rounded up to a multiple of the largest natural alignment of its fields, by adding padding bytes at the end of the structure. This ensures that in an array of such structures, each individual one is properly aligned as required by the fields.