关于C位字段的问题

问题描述 投票:7回答:5
  • bitfield是C概念还是C ++?
  • 它只能在结构中使用吗?我们可以使用它们的其他地方是什么?
  • AFAIK,bitfields是特殊的结构变量,只占用指定的no。比特。它有助于节省内存而不是其他任何东西。我对么?

我编写了一个小程序来理解位域的使用 - 但是,我认为它没有按预期工作。我希望下面结构的大小为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;
}

OUTPUT:

sizeof struct s = 12 bytes 
c bit-fields
5个回答
11
投票

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

此外,您告诉编译器您希望a仅占用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位对齐中。


7
投票

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

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

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


0
投票

它的C.

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


0
投票

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.