Guía de seguimiento dinámico de Solaris

Campos de bits

D también permite la definición de miembros de una unión o estructura de enteros de un número arbitrario de bits, que se conoce como campos de bits. Un campo de bits se declara especificando un tipo base de entero con signo o sin él, un nombre de miembro y un sufijo que indica el número de bits que se van a asignar al campo, como se muestra en el siguiente ejemplo:

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

El ancho del campo de bits es una constante de número entero separada del nombre del miembro por un punto. El ancho del campo de bits debe ser positivo y debe ser un número de bits inferior al ancho del tipo base de entero correspondiente. Es posible que los campos de bits más grandes de 64 bits no se declaren en D. Los campos de bits de D proporcionan compatibilidad y acceso a la capacidad correspondiente de ANSI-C. Normalmente, se utilizan en situaciones en las que el almacenamiento en memoria es un elemento preciado o cuando un diseño de estructura debe coincidir con el diseño de un registro de hardware.

Un campo de bits es una construcción de compilador que automatiza el diseño de un entero y un conjunto de máscaras para extraer los valores del miembro. Se puede obtener el mismo resultado definiendo simplemente las máscaras y utilizando el operador &. Los compiladores de C y D intentan empaquetar los bits de la manera más eficaz posible, sin embargo, pueden realizar esta operación en cualquier orden o forma que deseen. Por este motivo, no se garantiza que los campos de bits produzcan diseños de bits idénticos en distintas arquitecturas o compiladores. Si requiere un diseño de bits estable, deberá crear las máscaras de bits y extraer los valores utilizando el operador &.

Se accede a un miembro de campo de bits simplemente especificando su nombre en combinación con los operadores “.” o ->, al igual que cualquier otra estructura o miembro de una unión. El campo de bits se asigna automáticamente al siguiente tipo de entero más grande para utilizarlo en cualquier expresión. Debido a que es posible que el almacenamiento del campo de bits no se alinee en un límite de bytes o que sea un numero exacto de bytes en tamaño, no se debe aplicar los operadores sizeof o offsetof a un miembro de un campo de bits. El compilador de D también prohíbe tomar la dirección de un miembro del campo de bits utilizando el operador &.