Manuel de suivi dynamique Solaris

Champs de bit

Le langage D permet également de définir les membres entiers d'une struct ou d'une union constitués d'un nombre arbitraire de bits, les champs de bit. Pour déclarer un champ de bit, vous devez spécifier un type de base de nombre entier signé ou non signé, un nom de membre et un suffixe indiquant le nombre de bits à affecter au champ, comme illustré dans l'exemple suivant :

struct s {
	int a : 1;
	int b : 3;
	int c : 12;
};

La largeur du champ de bit est une constante entière séparée du nom du membre par le symbole : à droite. La largeur du champ de bit doit être positive et doit correspondre à un nombre de bits qui n'excède pas la largeur du type de base de nombre entier correspondant. Il n'est pas possible de déclarer en D les champs de bit dont la largeur est supérieure à 64 bits. Les champs de bit en D assurent la compatibilité et l'accès aux fonctionnalités ANSI-C correspondantes. Les champs de bits sont généralement utilisés dans des situations dans lesquelles le stockage en mémoire est crucial ou lorsque la disposition d'une struct doit correspondre à la disposition d'un registre matériel.

Un champ de bit est un constructeur de compilateur qui automatise la disposition d'un nombre entier et un ensemble de masques pour extraire la valeur des membres. Vous pouvez obtenir le même résultat en définissant simplement les masques vous-même et en utilisant l'opérateur &. Les compilateurs C et D essayent d'empiler les bits aussi efficacement que possible, mais ils sont libres d'exécuter cette action comme ils le souhaitent. Par conséquent, les champs de bit ne garantissent pas l'obtention de dispositions de bit identiques d'un compilateur ou d'une architecture à l'autre. Si une disposition de bit stable est requise, vous devez construire les masques de bit vous-même et extraire les valeurs à l'aide de l'opérateur &.

Vous pouvez accéder à un membre de champ de bit en spécifiant simplement son nom avec les opérateurs “.” ou -> comme tout autre membre d'une struct ou d'une union. Le champ de bit est automatiquement promu vers le type de nombre entier le plus grand à utiliser dans les expressions. Le stockage des champs de bit ne s'alignant pas sur une limite d'octets ou leur taille ne correspondant pas à un nombre entier rond, vous ne pouvez pas appliquer les opérateurs sizeof ou offsetof à un membre de champ de bit. Le compilateur D ne vous permet pas non plus de récupérer l'adresse d'un membre de champ de bit à l'aide de l'opérateur &.