Antes de responder, me gustaría darle algunos datos de Wiki
La alineación de la estructura de datos es la forma en que los datos se organizan y acceden en la memoria de la computadora. Se compone de dos cuestiones distintas pero relacionadas: la alineación de datos y los datos de estructura de relleno .
Cuando una computadora moderna lee o escribe en una dirección de memoria, lo hará en fragmentos de tamaño de palabra (por ejemplo, fragmentos de 4 bytes en un sistema de 32 bits). La alineación de datos significa colocar los datos en un desplazamiento de memoria igual a un múltiplo del tamaño de la palabra, lo que aumenta el rendimiento del sistema debido a la forma en que la CPU maneja la memoria.
Para alinear los datos, puede ser necesario insertar algunos bytes sin sentido entre el final de la última estructura de datos y el comienzo de la siguiente, que es el relleno de la estructura de datos .
gcc proporciona funcionalidad para deshabilitar el relleno de estructura. es decir, para evitar estos bytes sin sentido en algunos casos. Considere la siguiente estructura:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)será 12 en lugar de 8. Debido a la estructura de relleno. De forma predeterminada, en X86, las estructuras se rellenarán con una alineación de 4 bytes:
typedef struct
{
char Data1;
//3-Bytes Added here.
int Data2;
unsigned short Data3;
char Data4;
//1-byte Added here.
}sSampleStruct;
Podemos usar __attribute__((packed, aligned(X)))para insistir en el relleno de tamaño particular (X). X debe ser potencia de dos. Consulte aquí
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
entonces el atributo gcc especificado arriba no permite el relleno de la estructura. entonces el tamaño será de 8 bytes.
Si desea hacer lo mismo para todas las estructuras, simplemente podemos empujar el valor de alineación para apilar usando #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)