Maison  >  Article  >  développement back-end  >  Pourquoi `sizeof(myStruct)` renvoie-t-il 6 octets au lieu de 8 octets pour une structure avec trois membres `unsigned short` ?

Pourquoi `sizeof(myStruct)` renvoie-t-il 6 octets au lieu de 8 octets pour une structure avec trois membres `unsigned short` ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 19:17:02692parcourir

Why does `sizeof(myStruct)` return 6 bytes instead of 8 bytes for a struct with three `unsigned short` members?

Alignement de la mémoire dans les structures C : comprendre l'écart de taille

Lorsque vous travaillez avec des structures C, l'alignement de la mémoire joue un rôle crucial dans la détermination de la valeur réelle taille de la structure en mémoire. L'alignement de la mémoire fait référence au placement de structures de données dans des adresses mémoire divisibles par des limites spécifiques. Cela garantit un accès efficace aux données et une optimisation des performances.

Considérons une machine 32 bits sur laquelle l'alignement de la mémoire est généralement défini sur 4 octets. Dans ce contexte, une structure composée de plusieurs membres courts non signés, tels que :

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;

On pourrait s'attendre à ce que la taille de la mémoire de cette structure soit de 8 octets (3 x 2 octets). Cependant, l'opérateur sizeof(myStruct) ne renvoie que 6 octets. Cet écart peut être attribué à l'exigence d'alignement.

Dans le premier exemple, chaque membre court occupe 2 octets. Étant donné que la limite d’alignement est de 4 octets, aucun remplissage n’est inséré entre les membres. Ainsi, la taille totale reste à 6 octets.

En revanche, l'introduction d'un membre int dans la structure, comme vu ci-dessous, modifie le comportement d'alignement :

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;

Dans ce cas, le Le membre int nécessite une limite d’alignement de 4 octets. Pour garantir le respect de cette exigence, 2 octets de remplissage sont insérés entre le dernier membre court non signé (v3) et le membre int (i). Cela donne une taille totale de 12 octets (6 octets de données en short, 2 octets de remplissage et 4 octets de données en int).

Par conséquent, la différence de taille de mémoire entre les deux structures provient de les exigences d’alignement de leurs types de membres. Dans la première structure, la limite d'alignement est respectée par les membres courts eux-mêmes, tandis que dans la deuxième structure, un remplissage supplémentaire est requis pour respecter la limite d'alignement du membre int.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn