En C, las estructuras se disponen casi exactamente como se especifica en el código. Similar a StructLayout.Sequential de C#.
La única diferencia está en la alineación de miembros. Esto nunca reordena los miembros de datos en una estructura, pero puede cambiar el tamaño de la estructura al insertar bytes "pad" en el medio de la estructura. La razón para esto es asegurarse de que cada uno de los miembros comience en un límite (generalmente 4 u 8 bytes).
Por ejemplo:
struct mystruct {
int a;
short int b;
char c;
};
El tamaño de esta estructura suele ser de 12 bytes (4 por cada miembro). Esto se debe a que la mayoría de los compiladores, de forma predeterminada, harán que cada miembro tenga el mismo tamaño que el más grande de la estructura. Entonces el char ocupará 4 bytes en lugar de uno. Pero es muy importante tener en cuenta que sizeof (mystruct :: c) seguirá en 1, pero sizeof (mystruct) será 12.
Puede ser difícil predecir cómo el compilador rellenará/alineará la estructura .La mayoría se ajustará a los valores predeterminados como he explicado anteriormente, algunos no incluirán padding/alignment (también llamado "packed").
El método para alterar este comportamiento depende en gran medida del compilador, no hay nada en el lenguaje que especifique cómo se debe manejar esto. En MSVC usaría #pragma pack(1)
para desactivar la alineación (el 1 dice alinear todo en los límites de 1 byte). EN GCC usaría __attribute__((packed))
en la definición de estructura. Consulte la documentación de su compilador para ver qué hace de manera predeterminada y cómo cambiar ese comportamiento.
Algunos compiladores (es decir, GCC) implementan el mismo efecto que '#pragma pack' pero con un control más detallado sobre la semántica. –
Estoy sorprendido de ver un voto negativo. ¿Alguien puede señalar el error? – Potatoswatter
Gracias por su cuidado. Actualicé la pregunta mientras guiaste. – Eonil