taille de struct en C

Duplication possible:
Pourquoi sizeof pour une structure n’est-il pas égal à la sum de sizeof de chaque membre?

Considérons le code C suivant:

#include  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 la suivante:

4 30 36

Pourquoi la taille de la structure n’est-elle pas égale à la sum des tailles de ses variables de composant individuelles?

Le compilateur peut append un remplissage pour les besoins 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 chaque élément du type de structure aura chaque élément correctement aligné).

Par exemple:

 struct foo_t { int x; char c; }; 

Même si le champ c ne nécessite pas 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 type int 32 bits) car il faudra 3 octets de remplissage après le champ c .

Notez que le remplissage peut ne pas être requirejs par le système (comme x86 ou Cortex M3), mais les compilateurs peuvent toujours l’append pour des raisons de performances.

Comme mentionné, le compilateur C appenda un remplissage pour les besoins d’alignement. Ces exigences concernent souvent 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, comme 4 octets. C’est souvent la même chose que la longueur du mot. Ainsi, le compilateur C peut aligner les champs de votre structure sur cette valeur pour les rendre plus accessibles (par exemple, les valeurs de 4 octets doivent être alignées sur 4 octets). En outre, il peut aligner les données qui suivent la structure. . Je crois qu’il y a aussi d’autres raisons. Plus d’informations peuvent être trouvées sur cette page wikipedia.

L’alignement sur 6 octets n’est pas étrange, car il s’aligne sur des adresses multiples à 4.

Donc, fondamentalement, votre structure contient 34 octets et la structure suivante doit être placée sur l’adresse, c’est-à-dire 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.

Votre alignement par défaut est probablement 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.