Avant de répondre, j'aimerais vous donner quelques informations tirées de Wiki
Alignement des structures de données est la manière dont les données sont organisées et accessibles dans la mémoire de l'ordinateur. Il s'agit de deux questions distinctes mais liées : alignement des données y le remplissage des structures de données .
Lorsqu'un ordinateur moderne lit ou écrit dans une adresse mémoire, il le fait par morceaux de la taille d'un mot (par exemple, des morceaux de 4 octets sur un système 32 bits). Alignement des données consiste à placer les données dans un décalage de mémoire égal à un multiple de la taille du mot, ce qui augmente les performances du système en raison de la manière dont le processeur gère la mémoire.
Pour aligner les données, il peut être nécessaire d'insérer quelques octets sans signification entre la fin de la dernière structure de données et le début de la suivante. le remplissage des structures de données .
gcc propose une fonctionnalité permettant de désactiver le remplissage des structures, c'est-à-dire d'éviter ces octets sans signification dans certains cas. Considérons la structure suivante :
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
sera de 12 au lieu de 8, à cause du remplissage des structures. Par défaut, dans X86, les structures sont alignées 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érer aquí
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
l'attribut gcc spécifié ci-dessus n'autorise donc pas le remplissage de la structure. la taille sera donc de 8 octets.
Si l'on souhaite faire la même chose pour toutes les structures, il suffit de pousser la valeur d'alignement dans la pile en utilisant la fonction #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)
5 votes
Il s'agit d'un "type d'attribut" (J'ai trouvé ceci avec "C attribute packed" dans Google. D'autres peuvent sûrement faire au moins aussi bien).
1 votes
Voir cette question -- bien qu'avec
aligned(4)
vous n'avez probablement pas à vous inquiéter.