TRecord = packed record
a: Integer;
b: Integer;
c: Integer;
z: Boolean;
end;
esta estructura ocuparía 13 Bytes y si usas simplemente
TRecord = packed record
a: Integer;
b: Integer;
c: Integer;
z: Boolean;
end;
segun el compilador y su configuracion, podría ocupar 13 o 16 bytes por el alineamiento.
Por ejemplo si trabajas con estructuras dinamicas de datos, cuando le pides al sistema operativo 13 Bytes, va seguramente tardar más tiempo reservar la memoria que si fueran los 16 bytes. (es más, lo más probable es que te reserve 16 y solo se usen los 13 bytes) por eso a veces es bueno alenear.
Cuando tienes que trabajar con estructuras hechas en otros lenguajes puede ocurrir que Boolean no ocupe 1 Byte, por eso que por Posibilidad de compatibilidad estan los otros tipos.