Неправильные атрибуты с использованием битовых полей в классе C ++

Я пытаюсь использовать битовые поля в C ++ для достижения определенного размера класса, но по какой-то причине он больше, чем я ожидал.

Проблема в том, что класс с 32 битами (4 байта) сообщает (когда передается в качестве аргумента sizeof) 5 байт. Пример класса ниже:

typedef unsigned char u8;
typedef unsigned int u32;

class Test {
u8 four_bit_field : 4;
u8 eight_bit_field;
u32 twenty_bit_field : 20;
}__attribute__((packed));

Если four_bit_field а также eight_bit_field позиции поменялись, sizeof вернуть правильный размер, 4 байта. Я считаю, что это, вероятно, проблема с выравниванием памяти.

Итак, кто-то знает причину этого поведения? И, самое главное, как я могу это исправить, не меняя никаких позиций.

6

Решение

u8 поле без подсчета битов выравнивается по границе следующего байта, а не заполняется другими битовыми полями. Таким образом, ваши первые 4 бита занимают байт, вторые 8 бит берут, а последние 20 бит берут 3 байта, всего 5.

Если вы добавите размер битового поля в 8-битное поле, оно будет работать, см. http://ideone.com/Bexw6l

10

Другие решения

Это действительно проблема выравнивания. u8 eight_bit_field это не битовое поле, это просто unsigned char (из названия) и char, signed char или же unsigned char естественно выровнен по границе байта.

Поэтому вы в конечном итоге 4 биты заполнения между four_bit_field а также eight_bit_field а также 4 биты дополнения после twenty_bit_field; последний возможно многократно используется производным классом, первый навсегда потерян.

2

Попробуйте форсировать выравнивание до 1 байта:

#pragma pack(1)
class Test {
u8 four_bit_field : 4;
u8 eight_bit_field : 8;
u32 twenty_bit_field : 20;
};
#pragma pack()
2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector