为什么C/C++中没有单比特数据类型?

11
< p>对于bool来说,它只有true和false两个值,却有8位,为什么不把它设计成1位呢?

我知道有bitset,但是它并不是那么方便,我只是想知道为什么?


11
谁说 "bool 是 8 位的"? - Kerrek SB
1
每次需要布尔值时使用一个位会很低效,因为需要在 CPU 中确定正确的对应字节或字中的位并进行检查。唯一有意义的情况是当您管理一组布尔值时,这就是位域或位集的用途。 - lurker
3
基本上,由于大多数计算机内存是按字节寻址的。 - Matteo Italia
我认为这不完全是与标记的重复问题相同。让bool可寻址是有意义的,但这并不意味着没有任何类型是不可寻址的(比如1位类型)。实际上,你可以遇到这种情况(请参见我的答案)。 - Albert
另外,C语言还有一个1位类型 _Bool。它只有1个有效位,但通常还有(Typically 7 or 31)填充位。 - R.. GitHub STOP HELPING ICE
显示剩余4条评论
2个回答

16

并不是对于为什么没有本地类型的答案。但你可以通过像这样在结构体中获得1位类型:

struct A {
  int a : 1; // 1 bit wide
  int b : 1;
  int c : 2; // 2 bits
  int d : 4; // 4 bits
};
因此,如果没有填充(可能将其扩大为sizeof(void*)的倍数,即在32位系统上可能为4),sizeof(A) == 1是成立的。请注意,由于其他人所述的原因,您无法获取任何这些字段的指针。这也可能是为什么不存在本机类型的原因。

16

在主流CPU的硬件级别上,基本数据结构是字节。在这些CPU上操作位需要额外的处理,即一些CPU时间。对于bitset同样适用。


5
基本的数据结构通常是单词(word),其宽度通常为4个(32位)、8个(64位)或更多字节(例如SSE)。在这些大字操作中,每个字节的操作通常被模拟,并且有时甚至比本机字操作更慢,类似于您所说的位操作。不要混淆内存的基本数据结构(例如可按字节寻址)与CPU的基本数据结构。 - KillianDS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接