Questions sur C bitfields

  • Bitfield est-il un concept C ou C ++?

  • Peut-il être utilisé uniquement dans une structure? Quels sont les autres endroits où nous pouvons les utiliser?

  • Autant que je sache, les champs de bits sont des variables de structure spéciales qui occupent la mémoire uniquement pour le no spécifié. de bits. C’est utile pour économiser de la mémoire et rien d’autre. Ai-je raison?

J’ai codé un petit programme pour comprendre l’utilisation des champs de bits – Mais, je pense que cela ne fonctionne pas comme prévu. Je m’attends à ce que la taille de la structure ci-dessous soit de 1 + 4 + 2 = 7 octets (compte tenu de la taille de unsigned int, elle est de 4 octets sur ma machine), mais à ma grande surprise, elle s’avère être de 12 octets. ) Quelqu’un peut-il me dire pourquoi?

#include  struct s{ unsigned int a:1; unsigned int b; unsigned int c:2; }; int main() { printf("sizeof struct s = %d bytes \n",sizeof(struct s)); return 0; } 

SORTIE:

 sizeof struct s = 12 bytes 

Etant donné a et c ne sont pas contigus, ils réservent chacun une valeur totale d’espace mémoire. Si vous déplacez a et c ensemble, la taille de la structure devient 8 octets.

De plus, vous dites au compilateur que vous voulez a disque occupe seulement 1 bit , pas 1 octet. Ainsi, même si a et c ne doivent occuper que 3 bits au total (toujours sous un seul octet), la combinaison de a et c devient toujours alignée sur la mémoire de votre ordinateur 32 bits, occupant ainsi 4 octets. en plus de l’int b .

De même, vous constateriez que

 struct s{ unsigned int b; short s1; short s2; }; 

occupe 8 octets, tandis que

 struct s{ short s1; unsigned int b; short s2; }; 

occupe 12 octets car, dans ce dernier cas, les deux courts-métrages sont assis chacun dans leur propre alignement de 32 bits.

1) Ils sont originaires de C, mais font malheureusement partie de C ++.

2) Oui, ou dans une classe en C ++.

3) En plus d’économiser de la mémoire, ils peuvent être utilisés pour certaines formes de twiddling. Cependant, la sauvegarde de la mémoire et la rotation sont dépendantes de la mise en œuvre. Si vous voulez écrire un logiciel portable, évitez les champs de bits.

C’est c.

Votre comiler a arrondi l’allocation de mémoire à 12 octets à des fins d’alignement. La plupart des systèmes de mémoire d’ordinateur ne peuvent pas gérer l’adressage d’octet.

Votre programme fonctionne exactement comme je le pensais. Le compilateur alloue des champs de bits adjacents dans le même mot de mémoire, mais les vôtres sont séparés par un champ non-bit.

Déplacez les champs les uns à côté des autres et vous obtiendrez probablement 8, ce qui correspond à la taille de deux pouces sur votre ordinateur. Les champs de bits seraient emballés dans un seul int. Ceci est spécifique au compilateur, cependant.

Les champs de bits sont utiles pour économiser de l’espace, mais pas grand chose d’autre.

Les champs de bits sont largement utilisés dans les microprogrammes pour mapper différents champs dans les registres. Cela économise de nombreuses opérations manuelles au niveau du bit qui auraient été nécessaires pour lire / écrire des champs sans cela. Un inconvénient est que vous ne pouvez pas prendre l’adresse des champs de bits.