Compartir a través de


Campos de bits de C++

Las clases y estructuras pueden contener miembros que ocupan menos almacenamiento que un tipo entero. Estos miembros se especifican como campos de bits. La sintaxis para la especificación de member-declarator de un campo de bits es la siguiente:

Sintaxis

declarator : constant-expression

Comentarios

El declarador (opcional) es el nombre por el que se tiene acceso al miembro en el programa. Debe ser de tipo entero (incluidos los tipos enumerados). constant-expression especifica el número de bits que ocupa el miembro en la estructura. Los campos de bits anónimos, es decir, los miembros del campo de bits sin identificador, pueden utilizarse para el relleno.

Nota:

Un campo de bits sin nombre de ancho 0 fuerza la alineación del siguiente campo de bits con el siguiente tipo de límite, donde tipo es el tipo del miembro.

En el ejemplo siguiente se declara una estructura que contiene campos de bits:

// bit_fields1.cpp
// compile with: /LD
struct Date {
   unsigned short nWeekDay  : 3;    // 0..7   (3 bits)
   unsigned short nMonthDay : 6;    // 0..31  (6 bits)
   unsigned short nMonth    : 5;    // 0..12  (5 bits)
   unsigned short nYear     : 8;    // 0..100 (8 bits)
};

El diseño de memoria conceptual de un objeto de tipo Date se muestra en la ilustración siguiente:

Diagrama del diseño de memoria de un objeto de fecha, que muestra dónde se encuentran los campos de bits n WeekDay, n MonthDay, n Month y n Year.

32 bits de memoria se muestran en una fila. Empezando por el bit menos significativo, 3 bits son para nWeekDay. Los 6 bits siguientes son para nMonthDay. Los 5 bits siguientes son para nMonth. Los 2 bits siguientes no se usan. Los 8 bits siguientes son para nYear. Los 8 bits restantes no se usan.

nYear es de 8 bits de longitud, que desbordaría el límite de palabra del tipo declarado, unsigned short. Por lo tanto, comienza al principio de un nuevo unsigned short. No es necesario que todos los campos de bits quepan en un objeto del tipo subyacente; se asignan nuevas unidades de almacenamiento, según el número de bits solicitados en la declaración.

Específicos de Microsoft

El orden de los datos declarados como campos de bits es de un bit bajo a alto, como se muestra en la ilustración anterior.

FIN de Específicos de Microsoft

Si la declaración de una estructura incluye un campo sin nombre de longitud 0, como se muestra en el siguiente ejemplo:

// bit_fields2.cpp
// compile with: /LD
struct Date {
   unsigned nWeekDay  : 3;    // 0..7   (3 bits)
   unsigned nMonthDay : 6;    // 0..31  (6 bits)
   unsigned           : 0;    // Force alignment to next boundary.
   unsigned nMonth    : 5;    // 0..12  (5 bits)
   unsigned nYear     : 8;    // 0..100 (8 bits)
};

A continuación, el diseño de memoria es como se muestra en la siguiente ilustración:

Diagrama del diseño de un objeto Date, con un campo de bits de longitud cero, que fuerza el relleno de alineación.

64 bits de memoria se muestran en una fila. A partir del bit menos significativo, 5 bits son para n Month. Los 8 bits siguientes son para n Year. Los 19 bits siguientes no se usan. Los 3 bits siguientes son para n WeekDay. Los 6 bits siguientes son para n MonthDay. Los bits restantes no se usan.

El tipo subyacente de un campo de bits debe ser un tipo entero, como se describe en tipos integrados.

Si el inicializador de una referencia de tipo const T& es un valor lvalue que hace referencia a un campo bit de tipo T, la referencia no está enlazada directamente al campo de bits. En su lugar, la referencia se enlaza a un inicializado temporalmente para contener el valor del campo de bits.

Restricciones de los campos de bits

En la lista siguiente se detallan operaciones erróneas en campos de bits:

  • Tomar la dirección de un campo de bits.

  • Inicializar una noconst referencia con un campo de bits.

Consulte también

Clases y structs