【问题标题】:Is should be 12 size of mentioned class?应该是12个提到的班级吗?
【发布时间】: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


【解决方案1】:

提到的班级应该是 12 人吗? [原文]

结构的大小取决于许多平台相关的东西。例如,它取决于 (unsigned) int 的大小。在某些系统上它可能是 1,而在另一个系统上它可能更多。它还取决于位域是否“跨越”多个底层对象。在某些系统上可以,在其他系统上则不行。

_dummy_drc的大小是2 * sizeof(int),所以类的大小至少是2。

sizeof(int) == 4 和位域不跨越多个对象且字段从左到右分配且CHAR_BIT == 8 的系统上,(匿名结构,因此是联合,因此)包含类的预期大小为 8 :

|1 |2 |3 |4 |5 |p |6 |p     field position, p stands for padding
|1 |1 |1 |10|10|8 |10|22    field bits
|1 |2 |3 |13|23|32|10|32    cumulative bits since start of object
|1                |2        underlying integer position

PS。联合在 C++ 中的格式不正确,因为它包含一个匿名成员类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多