Partilhar via


Campos de bit C++

As classes e as estruturas podem conter membros que ocupam menos armazenamento do que um tipo integral. Esses membros são especificados como campos de bits. A sintaxe da especificação de member-declarator para um campo de bits é a seguinte:

Sintaxe

declarator : constant-expression

Comentários

O elemento (opcional)declarator é o nome pelo qual o membro é acessado no programa. Deve ser um tipo integral (incluindo tipos enumerados). A constant-expressionespecifica o número de bits que o membro ocupa na estrutura. Campos de bits anônimos, ou seja, membros de campos de bits sem identificador, podem ser usados para preenchimento.

Observação

Um campo de bits não nomeado de largura 0 força o alinhamento do próximo campo de bits com o próximo limite de type, onde type é o tipo do membro.

O exemplo a seguir declara uma estrutura que contém 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)
};

O layout de memória conceitual de um objeto do tipo Date é mostrado na figura a seguir:

Diagrama do layout de memória de um objeto date, mostrando onde os campos de bit n WeekDay, n MonthDay, n Month e n Year estão localizados.

32 bits de memória são exibidos em uma linha. Começando com o bit menos significativo, 3 bits são para nWeekDay. Os próximos 6 bits são para nMonthDay. Os próximos 5 bits são para nMonth. Os próximos 2 bits não são utilizados. Os próximos 8 bits são para nYear. Os 8 bits restantes não são utilizados.

nYear tem um comprimento de 8 bits, o que estouraria o limite de palavra do tipo declarado, unsigned short. Portanto, ele começa no início de um novo unsigned short. Não é necessário que todos os campos de bits caibam em um objeto do tipo subjacente; novas unidades de armazenamento são alocadas de acordo com o número de bits solicitados na declaração.

Seção específica da Microsoft

A ordenação dos dados declarados como campos de bits vai do bit menos significativo ao mais significativo, como mostrado na figura anterior.

Fim da seção específica da Microsoft

Se a declaração de uma estrutura inclui um campo não nomeado de comprimento 0, como mostrado no exemplo a seguir:

// 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)
};

Então o layout de memória fica conforme ilustrado na figura a seguir:

Diagrama do layout de um objeto Date com um campo de bits de comprimento zero, que força o preenchimento de alinhamento.

64 bits de memória são exibidos em uma linha. Começando com o bit menos significativo, 5 bits são para n Month. Os próximos 8 bits são para n Year. Os próximos 19 bits não são utilizados. Os próximos 3 bits são para n WeekDay. Os próximos 6 bits são para n MonthDay. Os bits restantes não são utilizados.

O tipo subjacente de um campo de bits deve ser um tipo integral, conforme descrito em Tipos internos.

Se o inicializador de uma referência do tipo const T& for um lvalue que se refere a um campo de bits do tipo T, a referência não estará associada diretamente ao campo de bits. Em vez disso, a referência está associada a um temporário inicializado para manter o valor do campo de bits.

Restrições em campos de bit

A lista a seguir detalha as operações erradas em campos de bits:

  • Obtendo o endereço de um campo de bits.

  • Inicializando uma referência non-const com um campo de bits.

Confira também

Classes e Structs