结构中位字段的用途是什么?

时间:2014-01-12 17:49:18

标签: c++ c

我听说过,结构中的位字段可用于保存一些字节的内存。我们如何将这个特定字节用于任何目的?

typedef struct
{
     char A : 1;
     int  B : 1;
} Struct1;

3 个答案:

答案 0 :(得分:4)

宽度为1位的char值本身并不特别有用。事实上,char值作为位字段不是标准的。这是微软增加的扩展。另一方面,B字段可以用作开/关值,因为它可以保存值1或0

Struct1 s;
s.B = 0;
if (s.B) { 
  ... 
}

这个特殊的例子并没有真正证明比特字段提供的节省特别好。需要一个更复杂的支柱。请考虑以下

typedef struct { 
  int Value1;
  int Value2;
} S1;

在大多数平台上,S1的大小为8(每个int字段的长度为4个字节)。想象一下,虽然Value1Value2将始终具有0到10之间的值。这可以存储在4位中,但我们使用32位含义。使用位字段我们可以在这里显着减少浪费

typedef struct { 
  int Value1 : 4;
  int Value2 : 4;
} S1;

现在S1的大小可能是1个字节,仍然可以保存所有必要的值

答案 1 :(得分:1)

在嵌入式系统中,结构中的位字段可用于表示位字段或硬件设备。

位字段的其他用途在协议(消息)中。用于表示许多事物的存在或不存在的一个字节(或4个字节)将占用大量空间并浪费传输时间。因此,在1个字节中,您可以表示8个布尔条件,而不是使用8个字节或8个字来执行此操作。

结构中的位字段通常用作方便。可以使用算术位运算符(例如AND)执行提取,设置或测试位字段的相同操作。

答案 2 :(得分:0)

节省内存意味着您需要更少的内存。由于更少的交换或缓存未命中,这可以提高程序性能。

在您的示例中,A和B两部分将存储在一个字节中(或编译器决定使用的任何部分),而不是两个。一个更好的例子是,如果你想将占用的座位存放在一个有1000个座位的歌剧院里。如果你将它们存储为一个布尔值,它通常以每个布尔值的字节存储,它们可以存储在128个字节中,因为每个座位只需要一个位。

缺点是性能损失。访问这些位需要一些额外的移位或xor-ing。因此,它是计算时间的权衡记忆。