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

Jér*_*ôme 127 c++ size boolean

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

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

或者这只是这些"历史"原因之一?

jal*_*alf 216

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

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

  • 如果我可以贡献一个狡猾的类比:我的建筑有八层楼,但邮局不承认它们是不同的地址.所以,如果我想要一个自己的地址,那么我必须租用整栋建筑,即使我实际上只适合一层楼.我没有使用其他七层"存储地址",我只是被迫浪费它们,因为邮局规则的地址是指建筑物,而不是地板.C++对象必须有自己的地址 - 没有邮局在发货后对邮件进行排序;-) (87认同)
  • 是的,这是一个硬件选择,如果硬件允许,bool的大小可能会改变.但是OP问为什么bool是8位宽,而在系统就是这种情况下,通常是因为CPU只能处理8位字节. (8认同)
  • "字节"寻址是一种架构选择(hw级别):人们可以很好地设计具有不同"寻址单元"的系统.对于常见的处理器,寻址"字节"无论如何最终从外部存储器获取多于"字节":这是由于效率原因. (7认同)
  • @jldupont:有一些系统的指针地址比字节更细粒度(我之前在旧的TI TMS34010/20上进行了编程,它使用了逐位指针),但它们很少见. (2认同)

小智 38

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


jld*_*ont 20

boolean类型通常如下寻址存储器的最小单位的目标机器(即,通常的8位字节)的.

对内存的访问总是处于"块"状态(多个字,这是为了提高硬件级别的效率,总线事务):在大多数CPU系统中,布尔位不能单独"寻址".当然,一旦数据包含在寄存器中,通常就会有专门的指令来独立地操作位.

出于这个原因,使用"位打包"技术以提高使用"布尔"基本数据类型的效率是很常见的.诸如enum(在C中)具有2编码功率的技术是一个很好的例子.大多数语言都有同样的技巧.

更新:由于一个很好的讨论,我注意到在C++ 中sizeof(char)==1定义.因此,"布尔"数据类型的寻址与可寻址存储器的最小单元相关联(强调了我的观点).

  • sizeof(char)== 1在C++中的每个定义,所以你的硬件能做什么或不能做什么是不相关的.你不能有sizeof(bool)<sizeof(char).BTW C++的定义方式是,如果不方便将char作为最小的硬件可寻址单元,则可以使用"胖"指针来寻址硬件可以解决的某些子单元.这至少在某些C编译器中用于旧字可寻址架构. (4认同)
  • 是的,在该系统上,bool可以成为一个位.但OP没有问"为什么在jlduponts假设的CPU上有8位宽的bool".他询问了当前的,常见的,日常的CPU,而这些是因为它们是字节可寻址的. (2认同)

Ben*_*kes 6

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

{1, 2, 5, 7}
Run Code Online (Sandbox Code Playgroud)

你可能在内存中有这个:

01100101
Run Code Online (Sandbox Code Playgroud)

当然,如果你愿意,你可以在C/C++中做类似的事情.(如果你跟踪一堆布尔值,它可能有意义,但这实际上取决于情况.)

  • 实际上,C++使用专门的容器向量<bool>来实现这一点 - 它通常被视为灾难. (7认同)
  • @Jerome:这是因为,由于有点不可寻址,它不能像普通的`vector`那样表现.它实际上不是STL类型的容器,因为对行为有约束.更糟糕的是,它会引起某些人的问题,他们想要制作一个`矢量'.这是令人惊讶的行为,而这不是你想要的语言. (2认同)