битовые поля — C ++ Substructure Size Bitfield Size

Учтите следующее:

class A { public:
int     gate_type :  4;
bool storage_elem :  1;
uint8_t privilege :  2;
bool      present :  1;
} __attribute__((packed));

class B { public:
struct Sub {
int     gate_type :  4;
bool storage_elem :  1;
uint8_t privilege :  2;
bool      present :  1;
} type_attr; //Also tried with "__attribute__((packed))" here in addition to outside
} __attribute__((packed));

Компилятор g ++ 4.8.1. sizeof (A) == 1, sizeof (B) == 4. Почему это так? Мне нужно что-то вроде структуры B, чтобы иметь размер 1.

5

Решение

Это может показаться глупым встречным вопросом. Я получаю желаемый результат, когда переписываю ваш пример как:

class A { public:
int     gate_type :  4;
bool storage_elem :  1;
uint8_t privilege :  2;
bool      present :  1;
} __attribute__((packed));

class B { public:
A type_attr; //Also tried with "__attribute__((packed))" here in addition to outside
};

Есть ли какая-то причина, по которой вы не можете использовать определение class A Внутри class B? Это действительно лучший способ сделать это.

Насколько я помню, ни C, ни C ++ не гарантируют, что struct Sub будет иметь такую ​​же компоновку и иметь идентичные требования к хранению class Aнесмотря на одинаковую ширину поля, порядок и т. д. (В случае С это было бы struct Sub против struct A, но та же идея верна, так как это все типы POD.)

Точное поведение должно быть ABI-зависимым. Повторно используя class A однако, как я уже говорил выше, я думаю, что вы немного более защищены от проблем с ABI. (Слегка, не непроницаемый.)

3

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector