2015-03-04 1 views
4

J'apprends C. C Primer Plus, j'ai vu un exemple de champ de bits comme suit:Quel est le but de champ de bits sans nom à la fin de la structure

struct box_props { 
    bool opaque    : 1; 
    unsigned int fill_color : 3; 
    unsigned int    : 4; 
    bool show_border   : 1; 
    unsigned int border_color : 3; 
    unsigned int border_style : 2; 
    unsigned int    : 2; 
}; 

Je comprends les 4 bits Un champ de bits sans nom au milieu est utilisé pour laisser les bits suivants commencer à un nouvel octet. Cependant, je ne comprends pas pourquoi il y a un autre champ de bits sans nom à la fin de la structure. Quel est le but de cela? Est-ce nécessaire?

+5

Non, c'est facultatif; fait pour le remplissage, dans l'espoir que le compilateur fasse la taille de la 'struct' 2 octets de long, ce qui devrait déjà être fait par la plupart des compilateurs. – legends2k

+0

http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member – Gopi

+0

@ légendes2k Merci. Vraiment apprécié. – Naitree

Répondre

5

Est-il nécessaire?

Non, c'est facultatif.

Quel est l'objectif?

Voici ce que dit la norme dans §9.6.2, C++ 11 (projet N3337, moi qui souligne):

Une déclaration pour un champ de bits qui omet l'identifiant déclare un bit sans nom -champ. Les champs de bits sans nom ne sont pas membres et ne peuvent pas être initialisés. [Remarque: Un champ de bits sans nom est utile pour le remplissage afin de se conformer aux dispositions imposées de l'extérieur. - note de fin] Dans un cas particulier, un champ de bits sans nom avec une largeur de zéro spécifie l'alignement du champ de bits suivant à une limite d'unité d'allocation. Ce n'est que lors de la déclaration d'un champ de bits sans nom que la valeur de l'expression constante peut être égale à zéro.

Il est donc un indice au compilateur que résumant tous les membres du struct conduit à 2 octects et est donc fait en espérant que le compilateur ferait les struct 2 octects longue. Cependant, selon la norme, il n'y a pas une telle exigence. Voici l'extrait du point précédent, §9.6.1:

des bits supplémentaires sont utilisés comme bits de remplissage et ne participent pas à la représentation de la valeur du champ de bits. L'allocation de champs de bits dans un objet de classe est définie par l'implémentation. L'alignement des champs de bits est défini par l'implémentation. Les champs de bits sont compressés dans une unité d'allocation adressable.

D'où la norme ne garantit pas plus loin que ce qui concerne la taille ou l'alignement d'un struct/class en utilisant les champs de bits.

+0

@Downvoter Vous voulez vous expliquer? – legends2k

5

Quel est le but de celui-ci? Est-ce nécessaire?

Il est utilisé pour le rembourrage. Vous pouvez le regarder comme un membre anonyme qui ne peut pas être référencé.

Il est facultatif et dépend entièrement de votre configuration requise.