【问题标题】:Bit-fields at two separate locations in a Structure in CC中结构中两个不同位置的位域
【发布时间】:2015-07-14 07:20:21
【问题描述】:

在一个结构中,我们通常有连续的位域;也就是一个接一个地相邻——例如:

struct demo
{
  char a;
  char b:1;
  char c:2;
  char d:2;
  int  e;  
} demo1;

demo1 的大小将是 8 个字节:

  • 大小 = a(1 字节) + 位域(1 字节) + 间隙(2 字节) + e(4 字节))

现在考虑以下结构:

struct demo
{
  char a;
  int  b:1;
  char c;
  char d;
  int  e:2;
} demo1;

当我使用 sizeof(demo1) 时,它给了我 8 个字节——但我想知道这些位域在内存中是如何呈现的。

如果像上面这样计算结构尺寸应该是:

  • 大小 = a(1 字节) + b(4 字节) + c(1 字节) + d(1 字节) + e(4 字节)

在编程过程中,我们不关心如何使用sizeof 计算大小,甚至不在两个不同的位置使用位域,但有时面试官会问这种类型的问题。

【问题讨论】:

  • 这个答案取决于很多事情。如果您的编译器重新排列结构元素,请不要感到惊讶。 :-)
  • 编译器是否有能力重新排列元素?
  • 我现在不能引用一些东西(跑去吃午饭),但是 AFAIK,是的。
  • @SouravGhosh:编译器无权重组结构。 a的地址必须在包含b的单元的地址之前,它必须在c的地址之前,它必须在d的地址之前,它必须在单元的地址之前包含e

标签: c structure bit-fields


【解决方案1】:

连续(非零宽度)位域可以合并到一个内存位置,而一个位域后跟一个非位域是不同的内存位置。

 struct demo
 {
      char a;
      int b:1;
      char c;
      char d;
      int  e:2;
 } demo1;

所以在这个struct 中,有 1 个非位域和 1 个位域,然后是 2 个非位域,最后是一个位域。

在位域成员之后有一个非位域(或零长度位域),接下来将是一个不同/独立的内存位置/对象。

还有:

编译器不会重新排序struct 的元素,因为这会违反C 标准。 C99 标准第 6.7.2.1 节规定:

在结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多