D'après ce code, la contrainte d'alignement de Personnage est de 8 octets alors que sa taille est de 32 octets... Je ne vois pas comment c'est possible.
On est d'accord que la contrainte d'alignement représente bien le nombre d'octets entre 2 adresses d'objets de même type ?
Je pensais que j'aurais le plus petit nombre au-dessus de la taille de mon objet à être une puissance de 2 (ici 32) mais ce n'est pas le cas...
L'alignement est une sorte de casier avec des boîtes de taille donnée. Dans ton exemple 8. La contrainte d'alignement fait juste en sorte de mettre un objet dans chaque boîte, c'est donc n'importe quel multiple de l'alignement qu'il faut prendre en compte.
Tu peux afficher les alignements fait par clang avec -Wpadding. (Je sais pas pour GCC).
EDIT: je n'ai pas les mêmes chiffres que toi, mais pour l'exemple :
L'alignement c'est une contrainte qui vient du processeur. Il ne peut accéder aux types qu'il connait (les types de base en C++) qu'à certaines adresses. Et on a presque toujours pour ces types : alignement égale taille de l'objet. Par exemple, si un int est de taille 4 octets, son adresse doit être multiple de 4. Et l'alignement est toujours une puissance de 2.
Quand on définit une structure, tous les champs qui la constituent doivent être alignés. Le compilateur s'occupe de gérer cela, il ajoute du padding si nécessaire. Avec un peu de recul, on voit que pour garantir cela la structure doit avoir un alignement égal à celui de champ qui a le plus grand alignement. Si on veut faire un tableau de structures, elles sont donc les unes à côté des autres et doivent être alignées pour garantir que leurs champs le soient aussi. Donc la taille de la structure doit être un multiple de son alignement. C'est le pourquoi du padding à la fin dans l'exemple de gbdivers.
Si l'int fait 4 octets, cette structure a un alignement de 4 et une taille de 12 octets! Vois-tu où il y a eu du padding? En changeant l'ordre des membres, la taille de la structure descend à 8 octets:
struct Machin {
int nombre;
char lettre;
bool actif;
};
En gros, la contrainte d'alignement fait toujours la même taille que le plus gros type primitif de cette structure (dans ton exemple int).
Et c'est dû au fait que le processeur ne traite pas directement la structure mais séparément les champs à l'intérieur.
Du coup la plupart du temps la contrainte d'alignement sera 8 octets vu que les types primitifs les gros en C++ font 8 octets.
Taille d'un objet ≥ sa contrainte d'alignement ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Discord NaN. Mon site.
Discord NaN. Mon site.
En recherche d'emploi.