Разрядность класса
есть класс, объявленный как:
class Payload {
uint8_t m_a : 1;
uint8_t m_b : 5;
uint8_t m_c : 2;
uint8_t m_d : 4;
};
вы видите, файл sizeof(Payload) == 2
. Все идет нормально. Общее количество бит составляет 12, оно превышает 8 бит, поэтому занято 2 байта.
Но есть ли способ получить количество битов, объявленное классом? Я хочу вернуть «12» ...? Конечно, чтобы алгоритм работал для любого типа битовых полей, определяющих классы, как указано выше, теоретически любого размера ...
Ответы
Нет, не в соответствии со стандартами.
[class.bit] / 1 :
атрибут битового поля не является частью типа члена класса
что означает, что эта информация не может быть извлечена во время компиляции. Любая попытка найти эту информацию с помощью методов самоанализа во время выполнения будет в лучшем случае полагаться на поведение, определяемое реализацией.
sizeof(Payload)*CHAR_BIT
. Он получает размер структуры в байтах и умножает его на количество бит на байт (технически не всегда 8). Это работает, потому что структуры, содержащие битовые поля, не могут иметь размер в битах, не кратный CHAR_BIT
. Компилятор добавит биты заполнения после последнего члена.