Maison > développement back-end > C++ > le corps du texte

Pourquoi en C/C++, la taille de la structure n'est pas égale à la somme des tailles de chaque membre ?

PHPz
Libérer: 2023-08-26 09:29:07
avant
828 Les gens l'ont consulté

La taille des éléments de type structure obtenus par

sizeof() n'est pas toujours égale à la taille de chaque membre individuel. Parfois, le compilateur ajoute du remplissage pour éviter les problèmes d'alignement. Les dimensions peuvent donc changer. Un remplissage est ajouté lorsqu'un membre de la structure est suivi d'un membre de plus grande taille ou se trouve à l'extrémité de la structure. Différents compilateurs ont différents types de contraintes d'alignement. Dans la norme C, la structure d'alignement totale dépend de l'implémentation.

Cas 1

Dans ce cas, le double z fait 8 octets de long, ce qui est plus grand que x (4 octets). Ainsi, 4 octets supplémentaires de remplissage sont ajoutés. De plus, les données de type court y disposent de 2 octets d'espace en mémoire, donc 6 octets supplémentaires sont ajoutés comme remplissage.

Pourquoi en C/C++, la taille de la structure nest pas égale à la somme des tailles de chaque membre ?

Exemple de code

#include <stdio.h>
struct myStruct {
   int x; //Integer takes 4 bytes, and padding 4 bytes
   double z; //Size of double is 8-byte, no padding
   short int y; //Size of short is 2-byte, padding 6-bytes
};
main() {
   printf("Size of struct: %d", sizeof(struct myStruct));
}
Copier après la connexion

Sortie 2

Size of struct: 24
Copier après la connexion

Cas 2

Dans ce cas, le double est d'abord inséré, ce qui occupe 8 octets d'espace. Maintenant, l'entier x (4 octets) est ajouté. Il reste donc encore 4 octets d'espace. Après avoir ajouté le y court, il peut être placé dans 4 octets d'espace supplémentaires, occupant un total de 16 octets d'espace.

Pourquoi en C/C++, la taille de la structure nest pas égale à la somme des tailles de chaque membre ?

Exemple de code

#include <stdio.h>
struct myStruct {
   double z; //Size of double is 8-byte, no padding
   int x; //Integer takes 4 bytes, and padding 4 bytes
   short int y; //Size of short is 2-byte, padding 6-bytes
};
main() {
   printf("Size of struct: %d", sizeof(struct myStruct));
}
Copier après la connexion

Sortie 2

Size of struct: 16
Copier après la connexion
Copier après la connexion

Cas 3

Le troisième cas occupe également 16 octets d'espace mémoire, mais est organisé différemment. Puisque le premier membre est un double, il est placé en premier, puis les données de type court sont ajoutées. Désormais, lorsqu'un entier est tenté d'être inséré, il peut être placé dans la zone restante de 6 octets. Par conséquent, il y a un remplissage après le court, mais aucun remplissage après les données entières.

Pourquoi en C/C++, la taille de la structure nest pas égale à la somme des tailles de chaque membre ?

Exemple de code

#include <stdio.h>
struct myStruct {
   double z; //Size of double is 8-byte, no padding
   short int y; //Size of short is 2-byte, padding 6-bytes
   int x; //Integer takes 4 bytes, and padding 4 bytes
};
main() {
   printf("Size of struct: %d", sizeof(struct myStruct));
}
Copier après la connexion

Sortie 2

Size of struct: 16
Copier après la connexion
Copier après la connexion

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!

Étiquettes associées:
source:tutorialspoint.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal