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

问题描述 投票:132回答:6

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

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

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

c++ boolean size
6个回答
219
投票

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

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


39
投票

存储器是字节可寻址的。如果不移位或屏蔽从内存中读取的字节,则无法寻址单个位。我想这是一个很大的原因。


20
投票
A boolean类型通常跟随可寻址存储器的最小单位(通常是8位字节)。

对内存的访问总是以“块”形式存在(多个词,这是为了硬件级别的效率,总线事务):在大多数CPU系统中,布尔位不能被“单独”寻址。当然,一旦数据包含在register中,通常会有专门的指令来独立地操作位。

由于这个原因,为了提高使用“布尔”基本数据类型的效率,通常使用“位打包”的技术。例如enum(用C表示)的幂为2的编码就是一个很好的例子。在大多数语言中都可以找到相同的技巧。

更新:由于进行了精彩的讨论,我注意到了C ++中definitionsizeof(char)==1。因此,“布尔”数据类型的寻址与可寻址内存的最小单位紧密相关(加强了我的观点)。


6
投票

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

{1, 2, 5, 7}

您可能在内存中:

01100101

当然,您可以根据需要在C / C ++中执行类似的操作。 (如果您要跟踪一堆布尔值,则could是有道理的,但这实际上取决于情况。)


1
投票

我知道这是旧的,但我认为我会投入2美分。

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

我去了一次求职面试,程序负责人对我说的一句话是:“当我们发送信号以发射导弹时,我们只是通过无线发送一个简单的开/关位。发送一个位的速度非常快我们需要该信号尽可能快。”

嗯,这是一次测试,以了解我是否理解概念以及位,字节和错误处理。一个坏家伙发出一小段味精会多么容易。或者,如果在传输过程中该位以其他方式翻转,会发生什么情况。


1
投票

某些嵌入式编译器的int1类型用于对布尔标志进行位打包(例如,用于Microchip MPU的CCS系列C编译器)。设置,清除和测试这些变量使用单指令位级指令,但是出于其他答案中指出的原因,编译器将不允许任何其他操作(例如,获取变量的地址)。

© www.soinside.com 2019 - 2024. All rights reserved.