在c++中,

为什么布尔值是1字节而不是1位? 为什么没有4位或2位整数类型?

在为CPU编写模拟器时,我忽略了上述内容


当前回答

bool can be one byte -- the smallest addressable size of CPU, or can be bigger. It's not unusual to have bool to be the size of int for performance purposes. If for specific purposes (say hardware simulation) you need a type with N bits, you can find a library for that (e.g. GBL library has BitSet<N> class). If you are concerned with size of bool (you probably have a big container,) then you can pack bits yourself, or use std::vector<bool> that will do it for you (be careful with the latter, as it doesn't satisfy container requirments).

其他回答

因为CPU不能寻址任何小于字节的东西。

Back in the old days when I had to walk to school in a raging blizzard, uphill both ways, and lunch was whatever animal we could track down in the woods behind the school and kill with our bare hands, computers had much less memory available than today. The first computer I ever used had 6K of RAM. Not 6 megabytes, not 6 gigabytes, 6 kilobytes. In that environment, it made a lot of sense to pack as many booleans into an int as you could, and so we would regularly use operations to take them out and put them in.

今天,当人们嘲笑你只有1gb的RAM,而你唯一能找到小于200gb的硬盘的地方是在古董店,它只是不值得麻烦打包比特。

因为字节是语言中最小的可寻址单位。

但是你可以让bool值为1位,如果你有很多 如。在结构体中,像这样:

struct A
{
  bool a:1, b:1, c:1, d:1, e:1;
};

你可以有1位的bool型和4位和2位的int型。但这将导致一个奇怪的指令集,没有性能提升,因为这是一种不自然的方式来看待体系结构。“浪费”一个字节的大部分,而不是试图回收未使用的数据,实际上是有意义的。

根据我的经验,唯一一个把几个bool包进一个字节的应用程序是Sql Server。

即使最小大小可能是1字节,你可以在1字节上有8位布尔信息:

http://en.wikipedia.org/wiki/Bit_array

Julia语言有BitArray,我读过c++实现。