Largura de bits de uma classe

Dec 06 2020

existe uma classe declarada como:

class Payload {
    uint8_t m_a : 1;
    uint8_t m_b : 5;
    uint8_t m_c : 2;
    uint8_t m_d : 4;
};

você vê, o sizeof(Payload) == 2. Por enquanto, tudo bem. A quantidade total de bits é 12, excede os 8 bits, portanto, 2Bytes estão ocupados.

Mas existe uma maneira de obter a quantidade de bits que a classe declara? Eu quero retornar '12' ...? Certifique-se de fazer o algoritmo funcionar para qualquer tipo de classe definindo bitfields como acima, teoricamente de qualquer tamanho ...

Respostas

1 dfrib Dec 06 2020 at 04:16

Não, não em conformidade com o padrão.

[class.bit] / 1 :

o atributo de campo de bits não faz parte do tipo do membro da classe

o que significa que essas informações não podem ser extraídas em tempo de compilação. Qualquer tipo de tentativa de encontrar essas informações usando técnicas de introspecção em tempo de execução dependeria, na melhor das hipóteses, do comportamento definido pela implementação.

1 Sneftel Dec 06 2020 at 03:32

sizeof(Payload)*CHAR_BIT. Isso obtém o tamanho da estrutura em bytes e o multiplica pelo número de bits por byte (tecnicamente nem sempre é 8). Isso funciona porque as estruturas contendo campo de bits não podem ter um tamanho em bits que não seja um múltiplo de CHAR_BIT. O compilador adicionará bits de preenchimento após o último membro.