Larghezza in bit di una classe
c'è una classe dichiarata come:
class Payload {
uint8_t m_a : 1;
uint8_t m_b : 5;
uint8_t m_c : 2;
uint8_t m_d : 4;
};
vedi, il sizeof(Payload) == 2. Fin qui tutto bene. La quantità totale di bit è 12, supera gli 8 bit, quindi 2 byte sono occupati.
Ma c'è un modo per ottenere la quantità di bit dichiarata dalla classe? Intendo restituire "12" ...? Sicuro di far funzionare l'algoritmo per qualsiasi tipo di classe che definisce i campi di bit come sopra, teoricamente di qualsiasi dimensione ...
Risposte
No, non in modo conforme agli standard.
[class.bit] / 1 :
l'attributo del campo di bit non fa parte del tipo del membro della classe
il che significa che queste informazioni non possono essere estratte in fase di compilazione. Qualsiasi tipo di tentativo di trovare queste informazioni utilizzando tecniche di introspezione a runtime si baserebbe, nella migliore delle ipotesi, su un comportamento definito dall'implementazione.
sizeof(Payload)*CHAR_BIT. Questo ottiene la dimensione della struttura in byte e la moltiplica per il numero di bit per byte (tecnicamente non è sempre 8). Questo funziona perché gli struct contenenti bitfield non possono avere una dimensione in bit che non sia un multiplo di CHAR_BIT. Il compilatore aggiungerà bit di riempimento dopo l'ultimo membro.