Bitbreite einer Klasse

Dec 06 2020

Es gibt eine Klasse, die wie folgt deklariert ist:

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

Sie sehen, die sizeof(Payload) == 2. So weit, ist es gut. Die Gesamtmenge der Bits beträgt 12, sie überschreitet die 8 Bit, wodurch 2 Bytes belegt sind.

Aber gibt es eine Möglichkeit, die Anzahl der von der Klasse deklarierten Bits zu ermitteln? Ich will '12' zurückgeben ...? Sicher, dass der Algorithmus für jede Art von Klasse funktioniert, die Bitfelder wie oben definiert, theoretisch jeder Größe ...

Antworten

1 dfrib Dec 06 2020 at 04:16

Nein, nicht standardkonform.

[class.bit] / 1 :

Das Bitfeldattribut ist nicht Teil des Typs des Klassenmitglieds

Dies bedeutet, dass diese Informationen zur Kompilierungszeit nicht extrahiert werden können. Jeder Versuch, diese Informationen mithilfe von Laufzeit-Introspektionstechniken zu finden, würde bestenfalls von einem implementierungsdefinierten Verhalten abhängen.

1 Sneftel Dec 06 2020 at 03:32

sizeof(Payload)*CHAR_BIT. Dadurch wird die Größe der Struktur in Bytes ermittelt und mit der Anzahl der Bits pro Byte multipliziert (technisch gesehen nicht immer 8). Dies funktioniert, weil bitfeldhaltige Strukturen keine Größe in Bits haben können, die kein Vielfaches von ist CHAR_BIT. Der Compiler fügt nach dem letzten Mitglied Füllbits hinzu.