Avant de répondre, j'aimerais vous donner quelques données du Wiki
L'alignement de la structure des données est la manière dont les données sont organisées et accessibles dans la mémoire de l'ordinateur. Il se compose de deux problèmes distincts mais liés: l'alignement des données et le remplissage de la structure des données .
Lorsqu'un ordinateur moderne lit ou écrit sur une adresse mémoire, il le fera par blocs de la taille d'un mot (par exemple, des blocs de 4 octets sur un système 32 bits). L'alignement des données signifie placer les données à un décalage de mémoire égal à un certain multiple de la taille du mot, ce qui augmente les performances du système en raison de la façon dont le processeur gère la mémoire.
Pour aligner les données, il peut être nécessaire d'insérer des octets sans signification entre la fin de la dernière structure de données et le début de la suivante, qui est le remplissage de la structure de données .
gcc fournit des fonctionnalités pour désactiver le remplissage de structure. c'est-à-dire pour éviter ces octets sans signification dans certains cas. Considérez la structure suivante:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
sera 12 au lieu de 8. En raison du rembourrage de la structure. Par défaut, dans X86, les structures seront complétées à un alignement sur 4 octets:
typedef struct
{
char Data1;
//3-Bytes Added here.
int Data2;
unsigned short Data3;
char Data4;
//1-byte Added here.
}sSampleStruct;
Nous pouvons utiliser __attribute__((packed, aligned(X)))
pour insister sur un rembourrage de taille particulière (X). X doit être une puissance de deux. Référez-vous ici
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
donc l'attribut gcc spécifié ci-dessus ne permet pas le remplissage de la structure. donc la taille sera de 8 octets.
Si vous souhaitez faire de même pour toutes les structures, nous pouvons simplement pousser la valeur d'alignement à empiler en utilisant #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)