Maison  >  Article  >  développement back-end  >  Pourquoi une structure C avec 3 entiers courts a-t-elle une taille de 6 octets, mais une structure similaire avec un entier ajouté a-t-elle une taille de 12 octets ?

Pourquoi une structure C avec 3 entiers courts a-t-elle une taille de 6 octets, mais une structure similaire avec un entier ajouté a-t-elle une taille de 12 octets ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 13:53:02579parcourir

 Why Does a C Structure with 3 Short Integers Have a Size of 6 Bytes, But a Similar Structure with an Integer Added Has a Size of 12 Bytes?

Alignement de la mémoire dans les structures C

En informatique, l'alignement de la mémoire fait référence aux restrictions placées sur les adresses auxquelles les données peuvent être stockées en mémoire . Comprendre l'alignement de la mémoire est crucial pour optimiser les performances du code et éviter les comportements inattendus.

Énoncé du problème :

Vous travaillez sur un système 32 bits où l'alignement de la mémoire est généralement réglé sur 4 octets. Considérez la structure suivante :

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

La structure contient trois champs de 2 octets, mais l'utilisation de l'opérateur sizeof renvoie 6 octets au lieu des 8 octets attendus. À l'inverse, la structure suivante :

<code class="c">typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;</code>

renvoie une taille de 12 octets, comme prévu en raison du nombre accru de champs et du potentiel de remplissage. Pourquoi y a-t-il une différence dans les tailles obtenues ?

Explication :

Sur la plupart des machines, les types de données sont alignés sur une limite ne dépassant pas leur taille. Dans ce cas, short fait 2 octets et int vaut 4 octets.

  • First Struct :

    • Puisque tous les membres sont 2 octets, la structure est alignée sur une limite de 2 octets.
    • Aucun remplissage n'est inséré entre les membres, ce qui donne une taille totale de 6 octets.
  • Deuxième structure :

    • La présence d'un entier de 4 octets nécessite que la structure soit alignée sur une limite de 4 octets.
    • 2 octets de remplissage sont inséré entre v3 et i pour assurer un bon alignement, portant la taille totale à 12 octets.

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