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

declarador: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, miembros de campo de bits sin identificador) se pueden usar 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:

Diagram of the memory layout of a date object, showing where the n WeekDay, n MonthDay, n Month, and n Year bit fields are located.

32 bits de memoria se muestran en una fila. A partir del bit menos significativo, 3 bits son para nWeekDay. Los 6 bits siguientes son para nMonthDay. Los siguientes 5 bits 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 se ajusten a 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 ejemplo siguiente:

// 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 ilustración siguiente:

Diagram of the layout of a Date object, with a zero length bit field, which forces alignment padding.

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