C ++:为什么布尔是8位长?

在C ++中,我想知道为什么booltypes是8位长(在我的系统上),只有一个位足以容纳布尔值?

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

还是仅仅是这些“历史”原因之一?

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

你将如何创build一个指向一个位? 你不能。 但是你可以创build一个指向一个字节的指针。 所以C ++中的布尔值通常是字节大小的。 (它也可能更大,这取决于实现,主要是它必须是可寻址的,所以C ++数据types不能小于一个字节)

内存是字节可寻址的。 不能移位或屏蔽从内存中读取的字节。 我会想象这是一个非常大的原因。

booleantypes通常遵循目标机器的最小可寻址内存单元 (即通常为8位字节)。

对内存的访问始终处于“块”(多个字,这是为了提高硬件级和总线事务的效率 ):在大多数CPU系统中,布尔位不能“单独”寻址。 当然,一旦数据被包含在一个寄存器中 ,通常有专门的指令来独立操纵比特。

出于这个原因,使用“位打包”技术以增加使用“布尔”基本数据types的效率是相当普遍的。 enum (C语言)的编码function就是一个很好的例子。 在大多数语言中都有类似的技巧。

更新 :由于一个很好的讨论,它引起了我的注意, sizeof(char)==1 定义在C ++中。 因此,寻址“布尔”数据types与可寻址内存的最小单位相关(加强了我的观点)。

8位是可寻址的最小内存量的答案是正确的。 但是,某种语言某种程度上可以使用1位布尔值。 我似乎记得帕斯卡执行设置为位串。 也就是说,对于以下集合:

 {1, 2, 5, 7} 

你可能在内存中有这个:

 01100101 

当然,如果你愿意的话,你可以在C / C ++中做类似的事情。 (如果你正在跟踪一堆布尔值,这可能是有道理的,但这取决于情况。)

一些embedded式编译器具有用于位打包布尔标志的int1types(例如,用于Microchip MPU的CCS编译器系列)。 设置,清除和testing这些variables使用单指令位级指令,但编译器将不允许任何其他操作(例如,获取variables的地址),原因是其他答案中提到的原因。

我知道这是旧的,但我想我会扔我的2美分。

如果将布尔型或数据types限制为一个位,则应用程序存在内存崩溃的风险。 你如何处理只有一个位长的内存错误统计?

我去面试了,程序领导对我说的一句话是:“当我们发送信号发射一个导弹时,我们只需通过无线发送一个简单的closures位,发送一个位非常快,我们需要这个信号尽可能快。“

那么,这是一个testing,看看我是否理解的概念和位,字节和error handling。 对于一个坏人来说,发送一个一位味精有多容易。 或者如果在传输过程中该位反过来又会发生什么情况。