Décalage dans une structure avec des champs de bits

Si nous avons une structure avec des champs de bits, comment les membres suivants sont-ils alignés dans la structure? Considérons le code suivant:

struct A{ int a:1; char b; // at offset 1 }; struct B{ int a:16; int b: 17; char c; // at offset 7 }; printf("Size of A: %d\n", (int)sizeof(struct A)); printf("Offset of b in A: %d\n", (int)offsetof(struct A, b)); printf("Size of B: %d\n", (int)sizeof(struct B)); printf("Offset of c in B: %d\n", (int)offsetof(struct B, c)); 

Sortie:

 Size of A: 4 Offset of b in A: 1 Size of B: 8 Offset of c in B: 7 

Ici, dans le premier cas, b est alloué juste dans le 2e octet de la structure sans aucun remplissage. Mais, dans le deuxième cas, lorsque les champs de bits dépassent de 4 octets, c est atsortingbué dans le dernier octet.

Que se passe-t-il dans le 2ème cas? Quelle est la règle pour le remplissage dans les structures impliquant des champs de bits en général?

comment les membres suivants sont-ils alignés dans la structure?

Personne ne sait. C’est un comportement défini par l’implémentation et donc spécifique au compilateur.

Que se passe-t-il dans le 2ème cas?

Le compilateur peut avoir ajouté des octets de remplissage ou des bits de remplissage. Ou l’ordre des bits de la structure peut être différent de ce que vous attendez. Le premier élément de la structure ne contient pas nécessairement le MSB.

Quelle est la règle pour le remplissage dans les structures impliquant des champs de bits en général?

Le compilateur est libre d’append n’importe quel type d’octets de remplissage (et de bits de remplissage dans un champ de bits), n’importe où dans la structure, tant que cela n’est pas fait au tout début de la structure.

Les champs de bits sont très mal définis par la norme. Ils sont essentiellement inutiles pour autre chose que des morceaux de drapeaux booléens alloués à des emplacements aléatoires en mémoire. Je vous conseillerais plutôt d’utiliser des opérateurs binarys sur des entiers simples. Vous obtenez alors un code portable déterministe à 100%.

Je prendrais un petit exemple. J’espère que cela clarifiera :: Considérez deux structures:

 struct { char a; int b; char c; } X; 

Contre.

 struct { char a; char b; int c; } Y; 

Un peu plus d’explications concernant les commentaires ci-dessous:

Tout ce qui suit n’est pas un 100%, mais la manière habituelle de construire les structures est un système 32 bits où int est 32 bits:

Struct X:

 | | | | | | | | | | | | | char pad pad pad ---------int---------- char pad pad pad = 12 bytes 

struct Y:

 | | | | | | | | | char char pad pad ---------int---------- = 8 bytes 

Je vous remercie

Quelques références ::

Structure de données Alignment-wikipedia