Разрядность класса

Dec 06 2020

есть класс, объявленный как:

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» ...? Конечно, чтобы алгоритм работал для любого типа битовых полей, определяющих классы, как указано выше, теоретически любого размера ...

Ответы

1 dfrib Dec 06 2020 at 04:16

Нет, не в соответствии со стандартами.

[class.bit] / 1 :

атрибут битового поля не является частью типа члена класса

что означает, что эта информация не может быть извлечена во время компиляции. Любая попытка найти эту информацию с помощью методов самоанализа во время выполнения будет в лучшем случае полагаться на поведение, определяемое реализацией.

1 Sneftel Dec 06 2020 at 03:32

sizeof(Payload)*CHAR_BIT. Он получает размер структуры в байтах и ​​умножает его на количество бит на байт (технически не всегда 8). Это работает, потому что структуры, содержащие битовые поля, не могут иметь размер в битах, не кратный CHAR_BIT. Компилятор добавит биты заполнения после последнего члена.