Si tiene la oportunidad de diseñar la estructura usted mismo, debería ser posible. La idea básica es que debe diseñarlo de modo que no haya necesidad de insertar bytes de relleno en él. el segundo truco es que debes manejar las diferencias en endianess.
Describiré cómo construir la estructura utilizando escalares, pero debería poder usar estructuras anidadas, siempre que aplique el mismo diseño para cada estructura incluida.
Primero, un hecho básico en C y C++ es que la alineación de un tipo no puede exceder el tamaño del tipo. Si fuera así, no sería posible asignar memoria usando malloc(N*sizeof(the_type))
.
Disposición de la estructura, comenzando con los tipos más grandes.
struct
{
uint64_t alpha;
uint32_t beta;
uint32_t gamma;
uint8_t delta;
A continuación, la almohadilla de la estructura de forma manual, por lo que al final va a coincidir con el tipo más grande:
uint8_t pad8[3]; // Match uint32_t
uint32_t pad32; // Even number of uint32_t
}
El siguiente paso es decidir si la estructura se debe almacenar en poco o grande formato endian La mejor manera es "intercambiar" todo el elemento in situ antes de escribir o después de leer la estructura, si el formato de almacenamiento no coincide con la endialencia del sistema host.
La eficiencia (rendimiento) obtenida al realizar la E/S binaria a menudo no justifica el dinero gastado en investigación, diseño, desarrollo y especialmente en la depuración y el mantenimiento. El código fuente debe ser simple de entender, pero no más simple. –