【发布时间】:2017-10-23 07:38:09
【问题描述】:
请分享您对此的看法:
class A
{
union {
unsigned int _dummy_drc[2];
struct {
unsigned int _trans_drc :1;
unsigned int _cap_drc :1;
unsigned int _fanout_drc :1;
unsigned int _trans_drc_index :10;
unsigned int _cap_drc_index :10;
unsigned int _fanout_drc_index :10;
};
};
};
应该是 12,为什么?
【问题讨论】:
-
带有'unsigned int _fanoutk_drc_index :31;' 12,没有它 8.
-
你为什么不
sizeof它并找出答案?unsigned int的大小取决于编译器和平台,因此不一定在所有系统上都相同。 -
我知道。问题是不同的: GCC for unsigned int 返回 4,所以我认为下面提到的类的 sizeof 应该是 8:class A { union { unsigned int _dummy_drc[2];结构{无符号整数_trans_drc:1;无符号整数_cap_drc:1;无符号整数_fanout_drc:1;无符号整数_trans_drc_index:10;无符号整数 _cap_drc_index :10;无符号整数_fanout_drc_index:10;无符号整数 _drc_unused :31; }; };
-
位域是实现定义的,它们的大小/布局在不同的编译器甚至同一编译器的不同版本上会有所不同(基本上避免用于可移植代码)。
sizeof是观察class A大小的唯一方法,如果升级编译器,它可能会改变。另请注意,在 C++(但不是 C)中,从不是最后写入的成员的联合成员中读取是未定义的行为。 -
请更新您的问题以显示任何新代码,而不是将其放入 cmets - 您的原始问题未提及 31 位
_drc_unused字段。尽管实现定义了位域固有的行为,但我希望在这种情况下添加_drc_unused字段会将大小从 8 增加到 12,原因很简单,单个位域不能跨越unsigned it边界(如果我没记错)。
标签: c++ memory-management operating-system