【问题标题】:Size of structure with bit fields具有位域的结构的大小
【发布时间】:2014-07-13 17:09:29
【问题描述】:

这里我有一个代码 sn-p。

#include <stdio.h>
int main()
{
    struct value
    {
        int bit1 : 1;
        int bit2 : 4;
        int bit3 : 4;
    } bit;

    printf("%d",sizeof(bit));

    return 0;
}

我得到的输出是 4(32 位编译器)。 谁能解释我怎么做?为什么不是 1+ 4 + 4 = 9? 我以前从未使用过位字段,所以希望得到一些帮助。谢谢你。 :)

【问题讨论】:

  • 1+4+4=9 实际上是 1bit + 4bit + 4bit = 9bit 而不是 9char(sizeof 给出的大小是 chars,而不是比特)。
  • 使用 unsigned char 代替。参考。 #pragma pack(n) 也是。
  • 每个结构都是 32 位的倍数(除非使用了 pragma pack)。所有的填充位都在那里,只是不容易看到。
  • 是的,现在明白了,谢谢:)

标签: c bit-fields


【解决方案1】:

当你告诉 C 编译器时:

int bit1 : 1

它将它解释为并分配给它一个整数;但将它的第一位称为bit1

因此,如果我们考虑您的代码:

struct value
{
    int bit1 : 1;
    int bit2 : 4;
    int bit3 : 4;
} bit;

您要告诉编译器的是:获取ints 的必要数量,并将块位1 称为bit1,然后将位2 - 5 称为@ 987654326@,然后将位 6 - 9 称为bit3

由于所需的完整位数是 9,而int 是 32 位(在您的计算机体系结构中),因此只需要 1 个int 的内存空间。因此,您得到的大小为 4(字节)。

相反,如果您使用chars 定义struct,由于char 是8 位,编译器将为每个chars 分配两个chars 的内存空间struct value。您将获得 2(字节)作为输出。

【讨论】:

    【解决方案2】:

    因为 C 请求将位打包在同一个单元中(这里是一个signed int/unsigned int):

    (C99, 6.7.2.1p10) “如果有足够的空间,结构中紧跟在另一个位域之后的位域应该被打包到同一单元的相邻位中”

    【讨论】:

      【解决方案3】:

      处理器只是喜欢一次性处理大约 32 位 - 而不是 9、34 等。

      它只是将它四舍五入到处理器喜欢的程度。 (让工人开心)

      【讨论】:

      • 我认为还有更多。当您说not 9, 34 时,我同意您的看法,显然大小将是 2 个字节的幂(1、2、4 等)。但是对于上面的示例,使用char 而不是int 将大小从4 更改为2,所以可能有一些取决于位字段的类型?我的理解是,使用声明为int 的位域,结构的大小不能小于int 之一(即4 个字节),但使用char 它可以缩小到1 个字节。
      • @holt - 它是总线的大小等。它喜欢并且一次只能处理 32 位。所以你得到了很多。
      • 如果所有内容都根据总线大小对齐,那么在 32 位架构上,所有内容都将对齐到 4 个字节,但情况并非如此(您可以在 1、2、4、8 上对齐等字节),如我的示例所示(如果在 OP 示例中将 int 更改为 charsizeof 返回 2,而不是 4)。
      • sizeof 运算符与对齐有什么关系?它说 X 可以适合 Y 位。没有提到你在装饰中有 Z 位
      • sizeof 与对齐无关,但您当前编写答案的方式表明,由于您将 OP 输出的 32 位与 what processor likes 混合。我只是指出32 位来自int 声明而不是“处理器喜欢什么”这一事实。如果它真的是“处理器喜欢什么”,那么与 char 声明相同的结构将占用 4 个字节,而事实并非如此(只有 2 个字节)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2011-02-08
      相关资源
      最近更新 更多