Duplicata possible:
Pourquoi la taille de la structure n'est-elle pas égale à la somme de la taille de chaque membre?
Considérez le code C suivant:
#include <stdio.h>
struct employee
{
int id;
char name[30];
};
int main()
{
struct employee e1;
printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1));
return(0);
}
La sortie est:
4 30 36
Pourquoi la taille de la structure n'est-elle pas égale à la somme des tailles de ses variables composantes individuelles?
Le compilateur peut ajouter un remplissage pour les exigences d'alignement. Notez que cela s'applique non seulement au remplissage entre les champs d'une structure, mais peut également s'appliquer à la fin de la structure (de sorte que les tableaux du type de structure auront chaque élément correctement aligné).
Par exemple:
struct foo_t {
int x;
char c;
};
Même si le champ c
n'a pas besoin de remplissage, la structure aura généralement une sizeof(struct foo_t) == 8
(sur un système 32 bits - plutôt un système avec un 32 $ int
) car il devra y avoir 3 octets de remplissage après le champ c
.
Notez que le remplissage peut ne pas être requis par le système (comme x86 ou Cortex M3) mais les compilateurs peuvent toujours l'ajouter pour des raisons de performances.
Comme mentionné, le compilateur C ajoutera un remplissage pour les exigences d'alignement. Ces exigences ont souvent à voir avec le sous-système de mémoire. Certains types d'ordinateurs ne peuvent accéder qu'à la mémoire alignée sur une certaine valeur "Nice", comme 4 octets. Il s'agit souvent de la même longueur que Word. Ainsi, le compilateur C peut aligner les champs de votre structure sur cette valeur pour les rendre plus faciles d'accès (par exemple, les valeurs de 4 octets doivent être alignées sur 4 octets). De plus, il peut remplir le bas de la structure pour aligner les données qui suivent la structure . Je pense qu'il y a aussi d'autres raisons. Plus d'informations peuvent être trouvées sur this page wikipedia.
Votre alignement par défaut est probablement de 4 octets. Soit l'élément de 30 octets a obtenu 32, soit la structure dans son ensemble a été arrondie à l'intervalle de 4 octets suivant.
L'alignement sur 6 octets n'est pas étrange, car il s'aligne sur plusieurs adresses à 4.
Donc, fondamentalement, vous avez 34 octets dans votre structure et la structure suivante doit être placée sur l'adresse, qui est multiple de 4. La valeur la plus proche après 34 est 36. Et cette zone de remplissage compte dans la taille de la structure.