C + + : 为什么 bool 是8位长?

在 C + + 中,我想知道为什么 bool 类型是8位长(在我的系统中) ,而只有一位足以保存布尔值?

我曾经认为这是出于性能原因,但是在32位或64位机器上,寄存器是32或64位宽,性能优势是什么?

还是只是这些“历史”原因中的一个?

80213 次浏览

因为每个 C + + 数据类型都必须是可寻址的。

如何创建指向单个位的指针?你不能。但是 可以会创建一个指向字节的指针。因此,C + + 中的布尔值通常是字节大小的。(它也可能更大。这取决于执行情况。主要是它必须是可寻址的,所以 C + + 数据类型不能小于一个字节)

内存是字节可寻址的。如果不移动或屏蔽从内存中读取的字节,则不能对任何位进行寻址。我想这是一个很大的原因。

boolean类型通常是目标机器的 跟随可寻址内存的最小单位(即通常是8位字节)。

对内存的访问总是以“块”的形式(多个单词,这是对 在硬件层面上的效率总线事务的访问) : 在大多数 CPU 系统中,布尔位不能“单独”处理。当然,一旦数据包含在 登记册中,通常会有专门的指令来独立操作位。

出于这个原因,为了提高使用“布尔型”基本数据类型的效率,使用 “钻头包装”技术是相当常见的。像 enum(C 语言)这样具有2倍编码能力的技术就是一个很好的例子。大多数语言中都存在同样的技巧。

更新 : 经过精彩的讨论,我注意到在 C + + 中 定义sizeof(char)==1。因此,“布尔”数据类型的寻址与可寻址内存的最小单元紧密相连(这强化了我的观点)。

关于8位是可寻址的最小内存量的答案是正确的。然而,在某种程度上,有些语言 可以对布尔值使用1位。我似乎记得 Pascal 将集实现为位字符串。也就是说,对于以下集合:

{1, 2, 5, 7}

你可能记得这个:

01100101

当然,如果您愿意的话,也可以在 C/C + + 中进行类似的操作。(如果您要跟踪一组布尔值,那么 可以是有意义的,但它实际上取决于具体情况。)

我知道这很旧了,但我还是想说说我的看法。

如果您将布尔值或数据类型限制为一位,那么您的应用程序将面临内存损坏的风险。如何处理只有一位长的内存中的错误统计信息?

我去参加一个工作面试,项目负责人对我说的一句话是: “当我们发送发射导弹的信号时,我们只是通过无线发送一个简单的比特。发送一个比特非常快,我们需要尽可能快的信号。”

这是一个测试,看看我是否理解了概念和位、字节和错误处理。对于一个坏人来说,发一条短信有多容易。或者如果在传输过程中比特被反转了会发生什么。

一些嵌入式编译器有一个 int1类型,用于位封装布尔标志(例如,用于微芯片微处理器的 C 编译器的 CCS 系列)。设置、清除和测试这些变量使用单指令位级指令,但编译器不允许任何其他操作(例如获取变量的地址) ,原因见其他答案。

然而,请注意,std::vector<bool>允许使用位封装,即以比普通 bool更小的单位存储位。但这不是必须的。