Guia de rastreamento dinâmico Solaris

Campos de bit

D também permite a definição de membros de struct de inteiro e de união com números de bits arbitrários, conhecidos como campos de bit. Um campo de bit é declarado pela especificação de um tipo base de inteiro assinado ou não assinado, um nome de membro e um sufixo indicando o número de bits a ser atribuído ao campo, como mostrado no exemplo seguinte:

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

A largura do campo de bit é uma constante de inteiro separada do nome do membro por uma vírgula à direita. A largura do campo de bit deve ser positiva e deve ter um número de bits que não seja maior que a largura do tipo base de inteiro correspondente. Os campos de bit maiores que 64 bits não podem ser declarados em D. Os campos de bits de D fornecem compatibilidade e acesso ao recurso ANSI-C correspondente. Os campos de bit são geralmente usados em situações em que o armazenamento de memória seja pelo menos premium ou quando um layout de struct deve corresponder ao layout de registro de hardware.

Um campo de bits é uma construção de compilador que automatiza o layout de um inteiro e um conjunto de máscaras para extrair os valores de membro. O mesmo resultado pode ser atingido pela simples definição de máscaras e pelo uso do operador &. Os compiladores de C e de D tentam empacotar bits, da forma mais eficiente possível, mas eles estão livres para fazê-lo em qualquer ordem ou de qualquer maneira, sendo assim, não há garantias de que os campos de bit produzam layouts de bit idênticos entre compiladores ou arquiteturas diferentes. Se você precisa de layout de bit estável, construa as máscaras de bits e extraia os valores usando o operador &.

Um membro de campo de bit é acessado pela simples especificação de seu nome em combinação com os operadores “.” ou ->, como qualquer outra struct ou membro de união. O campo de bit é automaticamente promovido para o próximo tipo de inteiro maior a fim de ser usado em quaisquer expressões. Como o armazenamento de campo de bit pode não estar alinhado em um limite de bytes ou ser um número de bytes arredondado em tamanho, você não pode aplicar os operadores sizeof ou offsetof a um membro de campo de bits. O compilador de D também proíbe você de pegar o endereço de um membro de campo de bit usando o operador &.