Szerokość bitowa klasy
istnieje klasa zadeklarowana jako:
class Payload {
uint8_t m_a : 1;
uint8_t m_b : 5;
uint8_t m_c : 2;
uint8_t m_d : 4;
};
widać, sizeof(Payload) == 2
. Jak na razie dobrze. Całkowita liczba bitów wynosi 12, przekracza 8 bitów, więc zajęte są 2 bajty.
Ale czy istnieje sposób, jak uzyskać liczbę bitów deklarowaną przez klasę? Mam na myśli zwrócenie 12 ...? Jasne, że algorytm będzie działał dla każdego rodzaju pól bitowych definiujących klasę, jak powyżej, teoretycznie dowolnego rozmiaru ...
Odpowiedzi
Nie, nie w sposób zgodny z normami.
[class.bit] / 1 :
atrybut pola bitowego nie jest częścią typu elementu klasy
co oznacza, że tych informacji nie można wyodrębnić w czasie kompilacji. Wszelkie próby znalezienia tych informacji przy użyciu technik introspekcji w czasie wykonywania polegałyby w najlepszym przypadku na zachowaniu zdefiniowanym przez implementację.
sizeof(Payload)*CHAR_BIT
. Pobiera rozmiar struktury w bajtach i mnoży go przez liczbę bitów na bajt (technicznie nie zawsze jest to 8). Działa to, ponieważ struktury zawierające pola bitowe nie mogą mieć rozmiaru w bitach, który nie jest wielokrotnością CHAR_BIT
. Kompilator doda bity wypełnienia po ostatnim składniku.