关于C位域的问题

  • bitfield是C概念还是C ++?

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

  • AFAIK,bitfields是特殊的结构变量,只占用指定的no。 比特。 它在节省内存方面很有用。 我对么?

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

#include  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; } 

OUTPUT:

 sizeof struct s = 12 bytes 

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

此外,您告诉编译器您希望仅占用1 而不是1个字节。 因此,即使ac彼此相邻也应该只占3位(仍然在单个字节下), ac的组合仍然在32位机器的内存中成为字对齐,因此占用了整整4个字节除了int b

同样,你会发现

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

占用8个字节,而

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

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

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

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

3)除了节省内存外,它们还可以用于某种forms的比特琐事。 但是,内存节省和twiddling本质上都依赖于实现 – 如果你想编写便携式软件,请避免使用位字段。

它的C.

您的编译器已将内存分配四舍五入为12个字节以进行对齐。 大多数计算机内存syubsystems无法处理字节寻址。

你的程序正如我所期望的那样工作。 编译器将相邻的位域分配到相同的存储器字中,但是您的位域由非位域分隔。

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

位域对于节省空间非常有用,但其他方面并不多。

位域广泛用于固件中以映射寄存器中的不同字段。 这节省了许多手动按位操作,这些操作在没有它的情况下读取/写入字段是必需的。 一个缺点是你无法获取位域的地址。