Maison  >  Article  >  développement back-end  >  Pourquoi `sizeof(myStruct2)` renvoie-t-il 12 octets alors que `sizeof(myStruct1)` renvoie 6 octets ?

Pourquoi `sizeof(myStruct2)` renvoie-t-il 12 octets alors que `sizeof(myStruct1)` renvoie 6 octets ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-26 10:01:03398parcourir

Why Does `sizeof(myStruct2)` Return 12 Bytes While `sizeof(myStruct1)` Returns 6 Bytes?

Alignement de la mémoire dans les structures C

Lorsqu'il s'agit de structures en C, l'alignement de la mémoire joue un rôle crucial dans l'optimisation de l'utilisation et des performances de la mémoire. Si vous êtes intrigué par la différence d'alignement de la mémoire entre les deux structures suivantes :

<code class="c">typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct1;

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct2;</code>

où myStruct1 et myStruct2 ont la même taille de données combinée de 6 octets, mais myStruct2 signale une taille de 12 octets en utilisant sizeof(), la réponse réside dans l'alignement de la mémoire.

Sur la plupart des machines 32 bits, la limite d'alignement est généralement de 4 octets. Cela signifie que les structures sont alignées au multiple de 4 octets le plus proche. Dans myStruct1, chaque membre fait 2 octets, donc aucun remplissage n'est inséré entre eux et la taille réelle reste à 6 octets.

Cependant, dans myStruct2, l'ajout d'un entier de 4 octets (int) nécessite un Limite d'alignement de 4 octets. Étant donné que les 6 octets initiaux de données de la structure d'origine ne s'alignent pas sur une limite de 4 octets, 2 octets de remplissage sont insérés entre v3 et i. Ce remplissage garantit que i commence sur une limite de 4 octets, ce qui donne une taille totale de 12 octets pour myStruct2.

N'oubliez pas que dans la plupart des cas, les structures ne sont alignées que sur la limite de leur plus grand membre. Dans ce cas, le membre int de myStruct2 détermine la limite d'alignement, ce qui explique la différence d'alignement de la mémoire entre les deux structures.

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