我听说过,结构中的位字段可用于保存一些字节的内存。我们如何将这个特定字节用于任何目的?
typedef struct
{
char A : 1;
int B : 1;
} Struct1;
答案 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个字节)。想象一下,虽然Value1
和Value2
将始终具有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。因此,它是计算时间的权衡记忆。