8
  • 位域是 C 概念还是 C++?

  • 它只能在结构中使用吗?我们可以在哪些其他地方使用它们?

  • AFAIK,位域是特殊的结构变量,仅占用指定编号的内存。位。它在节省内存方面很有用。我对么?

我编写了一个小程序来了解位域的用法 - 但是,我认为它没有按预期工作。我希望以下结构的大小为 1+4+2 = 7 字节(考虑到 unsigned int 在我的机器上的大小为 4 字节),但令我惊讶的是它原来是 12 字节(4+4+4 )。谁能告诉我为什么?

#include <stdio.h>

struct s{
unsigned int a:1;
unsigned int b;
unsigned int c:2;
};

int main()
{
  printf("sizeof struct s = %d bytes \n",sizeof(struct s));
  return 0;
}

输出:

sizeof struct s = 12 bytes 
4

5 回答 5

12

因为ac不是连续的,所以它们每个都保留一个完整的 int 值的内存空间。如果一起移动ac结构体的大小变为 8 个字节。

此外,您告诉编译器您只想a占用 1,而不是 1 字节。因此,即使aandc彼此相邻总共只占用 3 位(仍然在一个字节下),并且 的组合a仍然c在 32 位机器上的内存中字对齐,因此除了占用完整的 4 字节之外诠释b

同样,你会发现

struct s{
unsigned int b;
short s1;
short s2;
};

占用 8 个字节,而

struct s{
short s1;
unsigned int b;
short s2;
};

占用 12 个字节,因为在后一种情况下,两个短路都位于各自的 32 位对齐中。

于 2010-01-15T12:06:31.120 回答
8

1) 不幸的是,它们起源于 C,但也是 C++ 的一部分。

2) 是的,或者在 C++ 的一个类中。

3) 除了节省内存外,它们还可以用于某些形式的位旋转。然而,内存节省和旋转都依赖于实现——如果你想编写可移植软件,请避免使用位字段。

于 2010-01-15T12:07:04.887 回答
0

它的C。

出于对齐目的,您的编译器已将内存分配四舍五入为 12 个字节。大多数计算机内存syubsystems 不能处理字节寻址。

于 2010-01-15T12:07:50.323 回答
0

您的程序完全按照我的预期运行。编译器将相邻的位域分配到同一个内存字中,但您的位域由非位域分隔。

将位域彼此相邻移动,您可能会得到 8,这是您机器上两个整数的大小。位域将被打包到一个 int 中。但是,这是特定于编译器的。

位域对于节省空间很有用,但除此之外没有多大用处。

于 2010-01-15T12:08:40.523 回答
0

位域在固件中广泛用于映射寄存器中的不同字段。这节省了大量手动按位操作,如果没有它,这些操作将是读取/写入字段所必需的。一个缺点是您不能获取位域的地址。

于 2017-12-18T11:02:56.040 回答