Si depuro el siguiente código, veo que el valor del size
es 12 (como se esperaba).
#include <cstdint> int main(int argc, char *argv[]) { typedef struct __attribute__((__packed__)) { int8_t value; } time; typedef struct __attribute__((__packed__)) { uint8_t msg[8]; // time t1; uint32_t count; } theStruct; theStruct s; int size = sizeof(s); return 0; }
Curiosamente, al eliminar el comentario en "tiempo t1;", el valor de size
pasa a 16. Esperaba 13.
Sé (más o menos) que esto se explica por la historia del relleno de la estructura de datos...
Pero, ¿hay alguna forma de evitar este problema? ¿Qué hacer para leer size = 13
?
Hay algunos problemas con la emulación de empaquetado de estructuras MSVC de MinGW.
La solución consiste en pasar -mno-ms-bitfields
al compilador; esto hará que use su propio algoritmo de diseño en lugar de intentar emular MSVC.
Consulte también Empaquetado y alineación de estructuras con mingw (ARM, pero puede ser el mismo problema).
Es claramente un problema de alineación, lo que significa que no tiene nada que ver con el lenguaje en sí, sino con la plataforma subyacente.
Si la plataforma sabe (o piensa) que int32_t
necesita una alineación de 4, debe agregar 3 bytes de relleno después de un tiempo.
De todos modos __attribute__((__packed__))
no es C estándar y solo será interpretado por gcc (*). Peor aún, conduce a programas no portátiles: de acuerdo con esta respuesta en otra pregunta, causaría un error de bus en una arquitectura Sparc debido a un int32_t desalineado.
Sé que la arquitectura x86 (y sus derivados) son ahora las más comunes, pero aún pueden existir otras arquitecturas...
(*) según el equivalente de Visual C++ del __attribute__ de GCC ((__packed__)) , el equivalente de MSVC es #pragma pack(push, 1)