关于C位域的问题

aks*_*aks 8 c bit-fields

  • 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;
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

sizeof struct s = 12 bytes 
Run Code Online (Sandbox Code Playgroud)

Mar*_*off 12

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

此外,您告诉编译器您只想a占用1 而不是1个字节.因此,即使ac彼此相邻应仅占据3个比特总(仍在一个字节)的组合,ac仍然成为字对齐的32位机器上在存储器中,因此除了占据一个完整的4个字节int b.

同样,你会发现

struct s{
unsigned int b;
short s1;
short s2;
};
Run Code Online (Sandbox Code Playgroud)

占用8个字节,而

struct s{
short s1;
unsigned int b;
short s2;
};
Run Code Online (Sandbox Code Playgroud)

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


小智 8

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

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

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

  • 只要位域的基本类型是无符号类型,位域的算术属性就可以很好地定义,并且在任何地方都是相同的.例如,如果你有一个`unsigned x:4;`位域,那么`x`中的计算总是按模16进行. (5认同)