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.
libffi
until it has been passed to ffi_prep_cif
or
ffi_get_struct_offsets
.
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.
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.