Antes de responder, gostaria de fornecer alguns dados do Wiki
O alinhamento da estrutura de dados é a maneira como os dados são organizados e acessados na memória do computador. Consiste em duas questões separadas, mas relacionadas: alinhamento de dados e preenchimento da estrutura de dados .
Quando um computador moderno lê ou grava em um endereço de memória, ele faz isso em blocos do tamanho de palavras (por exemplo, blocos de 4 bytes em um sistema de 32 bits). Alinhamento de dados significa colocar os dados em um deslocamento de memória igual a alguns múltiplos do tamanho da palavra, o que aumenta o desempenho do sistema devido à maneira como a CPU lida com a memória.
Para alinhar os dados, pode ser necessário inserir alguns bytes sem sentido entre o final da última estrutura de dados e o início da próxima, que é o preenchimento da estrutura de dados .
O gcc fornece funcionalidade para desativar o preenchimento da estrutura. ou seja, para evitar esses bytes sem sentido em alguns casos. Considere a seguinte estrutura:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
será 12 em vez de 8. Por causa do preenchimento da estrutura. Por padrão, no X86, as estruturas serão preenchidas com alinhamento de 4 bytes:
typedef struct
{
char Data1;
//3-Bytes Added here.
int Data2;
unsigned short Data3;
char Data4;
//1-byte Added here.
}sSampleStruct;
Podemos __attribute__((packed, aligned(X)))
insistir no preenchimento de tamanho (X) específico. X deve ter poderes de dois. Consulte aqui
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
portanto, o atributo gcc especificado acima não permite o preenchimento da estrutura. então o tamanho será 8 bytes.
Se você deseja fazer o mesmo para todas as estruturas, basta pressionar o valor do alinhamento para empilhar usando #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)