Ancho de bits de una clase
hay una clase declarada como:
class Payload {
uint8_t m_a : 1;
uint8_t m_b : 5;
uint8_t m_c : 2;
uint8_t m_d : 4;
};
ya ves, el sizeof(Payload) == 2
. Hasta aquí todo bien. La cantidad total de bits es 12, excede los 8 bits, por lo que se ocupan 2 bytes.
Pero, ¿hay alguna forma de obtener la cantidad de bits que declara la clase? Me refiero a devolver '12' ...? Asegúrese de que el algoritmo funcione para cualquier tipo de clase que defina campos de bits como se indicó anteriormente, teóricamente de cualquier tamaño ...
Respuestas
No, no de forma estándar.
[class.bit] / 1 :
el atributo de campo de bits no es parte del tipo de miembro de clase
lo que significa que esta información no se puede extraer en tiempo de compilación. Cualquier tipo de intento de encontrar esta información utilizando técnicas de introspección en tiempo de ejecución dependería, en el mejor de los casos, del comportamiento definido por la implementación.
sizeof(Payload)*CHAR_BIT
. Esto obtiene el tamaño de la estructura en bytes y lo multiplica por el número de bits por byte (técnicamente no siempre es 8). Esto funciona porque las estructuras que contienen campos de bits no pueden tener un tamaño en bits que no sea un múltiplo de CHAR_BIT
. El compilador agregará bits de relleno después del último miembro.