Sans rembourrage, et en supposant sizeof (int) == sizeof (char *) == sizeof (long) == 4, la taille de la structure extérieure sera 13.
Décomposant, la union var
chevauche une structure anonyme avec un seul long
. Cette structure interne est plus grande (un pointeur et un long) de sorte que sa taille contrôle la taille de l'union, ce qui fait que l'union consomme 8 octets. Les autres membres sont 4 octets et 1 octet, donc le total est 13.
Dans toute implémentation sensible avec les hypothèses de taille que j'ai faites ci-dessus, cette structure sera complétée à 2 octets ou 4 octets, en ajoutant au moins 1 ou 3 octets supplémentaires à la taille. En général, comme les tailles de tous les types de membres sont elles-mêmes définies par l'implémentation et que le remplissage est défini par l'implémentation, vous devez vous référer à la documentation pour votre implémentation et à la plate-forme pour être sûr.
L'implémentation est autorisée à insérer un remplissage après essentiellement tout élément d'une structure. Les mises en œuvre judicieuses utilisent un minimum de rembourrage pour répondre aux exigences de la plate-forme (par exemple, les processeurs RISC exigent souvent qu'une valeur soit alignée sur la taille de cette valeur) ou pour des performances. Si vous utilisez une structure pour mapper des champs à la disposition des valeurs assumées par spécification de format de fichier, un coprocesseur dans la mémoire partagée, un périphérique matériel ou tout autre cas où l'empaquetage et la disposition importent réellement, alors vous pourriez vouloir vous êtes préoccupé par le fait que vous testez au moment de la compilation ou de l'exécution que vos suppositions de la disposition des membres sont vraies. Cela peut être fait en vérifiant la taille de la structure entière, ainsi que les décalages de ses membres. Entre
Voir this question entre autres pour une discussion des astuces d'assertion à la compilation.
Vous ne pouvez pas en être certain, car le compilateur peut gérer ces constructions pour un meilleur alignement des données. – Joe
Mais le rembourrage est une option que le programmeur doit mentionner à droite? Quelle serait la disposition de la mémoire si le code est compilé comme il est ci-dessus –
Non, le compilateur peut (et souvent va) insérer padding par défaut. –