Campos de bits de C++
Classes e estruturas podem conter membros que ocupam menos armazenamento que tipo integral.Esses membros são especificados como campos de bits.A sintaxe para o campo de bit Declarador de membro especificação segue:
declarator : constant-expression
Comentários
(Opcional) declarator é o nome pelo qual o membro é acessado no programa.Ele deve ser um tipo integral (incluindo os tipos enumerados).O expressão de constante Especifica o número de bits que o membro ocupa da estrutura.Campos de bits anônimo — ou seja, os membros de campo de bits sem nenhum identificador — pode ser usada para preenchimento.
Observação |
---|
Um campo de bits sem nome da largura 0 força o alinhamento do próximo campo de bit para o próximo type limite, 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.
Layout de memória do objeto Date
Observe que nYear é de 8 bits de comprimento e poderia exceder o limite de palavra do tipo declarado, unsigned short.Portanto, é iniciada no início de uma nova unsigned short.Não é necessário que todos os bits de campos para caber em um objeto do tipo subjacente; novas unidades de armazenamento são alocadas, de acordo com o número de bits solicitada na declaração.
Específicos do Microsoft
A ordenação de dados declarados como campos de bits é de bits baixa a alta, como mostrado na figura acima.
Específicos do Microsoft final
Se a declaração de uma estrutura inclui um campo sem nome de comprimento 0, conforme 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)
};
o layout da memória é conforme mostrado na figura a seguir.
Layout de objeto de data com o campo de bits de comprimento Zero
O tipo subjacente de um campo de bits deve ser um tipo integral, conforme descrito em Tipos fundamentais.