C++子结构位域大小
C++ Substructure 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。
这似乎是一个愚蠢的反问。 当我将您的示例重写为时,我得到了您想要的结果:
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 B
中重用class A
的定义吗? 这似乎真的是更好的方法。
我记得,尽管具有相同的字段宽度,顺序等,但C和C++都不能保证struct Sub
具有与class A
相同的布局和相同的存储要求。 (在 C 的情况下,这将是 struct Sub
vs. struct A
,但同样的想法成立,因为这些都是 POD 类型。
确切的行为应该依赖于 ABI。 不过,通过像我上面所做的那样重用class A
,我认为你让自己对 ABI 问题免疫力更强。 (稍微,不是不可渗透的。
相关文章:
- C++Union/Struct位域的实现和可移植性
- 具有位域的结构的 Constexpr 构造函数
- 如何解释 #if/#else 位域?(VC++菜鸟)
- 枚举位域和聚合初始化
- 在有符号基础类型枚举的位域上溢出
- 如何检查位域是否跨越所有位
- 访问位域联合是C++标准中常见的初始数据未定义行为
- 锈迹位域和枚举C++样式
- C/C++:uint8_t位域的行为不正确且不一致
- 如何将位域写入二进制文件
- 32 位和 64 位的结构大小不同
- 字节序和大小为 1 的位域
- 面向对象编程 - 位域私有结构的公共参考
- 使用位域的结构大小不正确
- 在 mingw 的 gcc-5.3 下具有混合位域和枚举递减的结构的意外大小
- 大小编译指示打包的位域结构数组
- 如何在结构声明中初始化位域
- 如何从带有位域的c++结构中提取值
- c++位域结构体大小定义(为什么它被包装得更大?)
- 带有位域的结构体的sizeof