[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