taille d’une classe définie par l’utilisateur

pourquoi la taille de la classe cl1 dans le code suivant est 8 mais pas 5 alors que la taille de la classe cl2 est 1?

class cl1 { public: int n; char cb; cl1(); ~cl1(); }; class cl2 { public: char cb; cl2(); ~cl2(); }; 

Le compilateur est libre d’insérer un remplissage entre et après les membres de la classe afin de s’assurer que les variables sont correctement alignées, etc. Le type de remplissage utilisé est à la hauteur de l’implémentation. Dans ce cas, je suppose que le compilateur ajoute 3 octets de remplissage après cl1::cb , peut-être pour s’assurer que la prochaine variable en mémoire est alignée sur une limite de 4 octets.

Le membre le plus grand de cl1 ( n ) est de 4 octets; la taille de cl1 est donc cl1 aux 4 octets les plus proches (8 dans ce cas), de sorte qu’un tableau d’objects cl1 ne crée pas n membres non alignés sur 4- adresses d’octet. La plupart des processeurs détestent vraiment les valeurs multi-octets mal alignées, subissant soit des pertes de performances (deux cycles de mémoire permettant d’accéder à une valeur), soit des pannes totales (exceptions d’alignement).

Rien ne garantit que cela sera cohérent d’un compilateur à l’autre ou d’une plate-forme à l’autre.

Tout cela est dû au rembourrage. Plus d’informations peuvent être trouvées, par exemple, ici

Le fait est que les adresses de l’object et de ses membres doivent être correctement alignées pour des raisons spécifiques au système d’exploitation et au matériel. Donc le résultat. Le problème de remplissage est compliqué par le fait que les objects d’un tableau doivent être situés de manière consécutive, sans espace entre eux, et que ALL doit être correctement aligné.

C’est à cause du remplissage de la structure par le compilateur. Si vous souhaitez supprimer le remplissage, essayez #pragma pack (1) et vous devriez obtenir 5 et 1 comme prévu.

Pendant que vous explorez la taille de la structure et comment le remplissage est effectué, laissez-moi vous dire une chose intéressante. La taille de la structure dépend non seulement des membres, mais également de l’ordre de leur déclaration . Par exemple, la taille des structures suivantes est différente, même si les deux ont le même nombre de membres du même type, la seule différence est l’ordre de leur déclaration!

 struct A { int a; char b; char c; }; struct B { char b; int a; char c; }; cout << "sizeof(A) = " << sizeof(A) << endl; cout << "sizeof(B) = " << sizeof(B) << endl; 

Sortie:

 sizeof(A) = 8 sizeof(B) = 12 

Démo en ligne sur Ideone: http://www.ideone.com/8OoxX