[fpc-pascal] record alignment

Karoly Balogh (Charlie/SGR) charlie at scenergy.dfmk.hu
Fri Jun 15 10:45:18 CEST 2018


Hi,

On Fri, 15 Jun 2018, Ryan Joseph wrote:

> I have a struct I need to port from C but the size I’m getting in Pascal
> is wrong. From C sizeof(AAPLVertex) = 32 but in Pascal
> sizeof(AAPLVertex) = 24.
>
> The alignment of the struct is on 32 bit bounds I think but how do I
> replicate this in Pascal so it behaves exactly like c? I tried using
> $align but it didn’t seem to have any effect.
>
> {$align 32}
> type
> 	TAAPLVertex = packed record
> 		position: vector_float2;
> 		color: vector_float4;
> 	end;

The whole idea of a packed record is to ignore alignment and "pack" the
fields ignoring padding and alignment. Use a normal record without
"packed", or add the padding fields manually, if you still have to use a
packed record for whatever reason.

BTW, $align specifies the alignment in *BYTES* not in bits. So to align to
32bits you need {$align 4}. But Free Pascal also supports {$packrecords
C}, where it will try to mimic the C compiler's alignment as native to the
target platform. In any unit which needs to interface to a C library, I'd
use {$packrecords C} and no {$align}

This is all documented BTW at the respective directives...

Charlie


More information about the fpc-pascal mailing list