Учтите следующее:
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.
Это может показаться глупым встречным вопросом. Я получаю желаемый результат, когда переписываю ваш пример как:
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. (Слегка, не непроницаемый.)
Других решений пока нет …