请考虑以下事项:
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。
答案 0 :(得分:3)
这似乎是一个愚蠢的反问题。当我将你的例子重写为:
时,我得到你想要的结果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
相同的布局并具有相同的存储要求。 (在C&C的情况下,它是struct Sub
与struct A
,但同样的想法成立,因为这些都是POD类型。)
确切的行为应该是ABI依赖的。但是,正如我在上面所做的那样重复使用class A
,我认为你会让自己对ABI问题有更多的免疫力。 (稍微不是不透水的。)