2.3.3 Size and Alignment

libffi will set the size and alignment fields of an ffi_type object for you. It does so using its knowledge of the ABI.

You might expect that you can simply read these fields for a type that has been laid out by libffi. However, there are some caveats.

So, before examining these fields, it is safest to pass the ffi_type object to ffi_prep_cif or ffi_get_struct_offsets first. This function will do all the needed setup.

ffi_type *desired_type;
ffi_abi desired_abi;
...
ffi_cif cif;
if (ffi_prep_cif (&cif, desired_abi, 0, desired_type, NULL) == FFI_OK)
  {
    size_t size = desired_type->size;
    unsigned short alignment = desired_type->alignment;
  }

libffi also provides a way to get the offsets of the members of a structure.

Function: ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets)

Compute the offset of each element of the given structure type. abi is the ABI to use; this is needed because in some cases the layout depends on the ABI.

offsets is an out parameter. The caller is responsible for providing enough space for all the results to be written – one element per element type in struct_type. If offsets is NULL, then the type will be laid out but not otherwise modified. This can be useful for accessing the type’s size or layout, as mentioned above.

This function returns FFI_OK on success; FFI_BAD_ABI if abi is invalid; or FFI_BAD_TYPEDEF if struct_type is invalid in some way. Note that only FFI_STRUCT types are valid here.