为什么布尔1字节而不是1位大小?

时间:2011-01-07 15:02:32

标签: c++ cpu-architecture

在C ++中,

  • 为什么布尔1字节而不是1位大小?
  • 为什么不存在类似4位或2位整数的类型?

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

13 个答案:

答案 0 :(得分:176)

因为CPU无法处理小于一个字节的任何内容。

答案 1 :(得分:27)

来自Wikipedia

  

历史上,一个字节是数字   用于编码单个字符的位   在计算机中的文本,它是   因此基本可寻址   许多计算机中的元素   架构。

所以字节是 基本可寻址单元,计算机体系结构无法解决这个问题。由于没有(可能)存在支持4位字节的计算机,因此您没有 4位 bool等。

但是,如果您可以设计一个可以将4位作为基本可寻址单元的架构,那么您将只有4位的bool,只能在该计算机上使用!

答案 2 :(得分:12)

最简单的答案是;这是因为CPU以字节为单位而不是以位为单位来寻址内存,而按位操作非常慢。

但是,可以在C ++中使用位大小分配。有位向量的std :: vector专门化,以及采用位大小的条目的结构。

答案 3 :(得分:8)

回到过去,我不得不在狂暴的暴风雪中走路上学,双向上坡,午餐是我们可以在学校后面的树林中追踪的任何动物,用我们的双手杀死,电脑少得多可用的内存比今天。我用的第一台电脑有6K的RAM。不是6兆字节,不是6千兆字节,6千字节。在那种环境中,将尽可能多的布尔值打包到int中是很有意义的,因此我们会定期使用操作将它们取出并放入。

今天,当人们嘲笑你只有1 GB的RAM,并且你能找到一个低于200 GB的硬盘的唯一地方就是古董店时,打包它不值得。< / p>

答案 4 :(得分:6)

你可以有1位bool和4位和2位整数。但这会产生一个奇怪的指令集,没有性能提升,因为这是一种不自然的方式来看待架构。实际上,“浪费”一个字节的更好部分而不是试图回收那些未使用的数据是有意义的。

根据我的经验,唯一困扰将多个bool打包成单个字节的应用程序是Sql Server。

答案 5 :(得分:5)

您可以使用位字段来获取子大小的整数。

struct X
{
    int   val:4;   // 4 bit int.
};

虽然它通常用于将结构映射到精确的硬件预期位模式:

struct SomThing   // 1 byte value (on a system where 8 bits is a byte
{
    int   p1:4;   // 4 bit field
    int   p2:3;   // 3 bit field
    int   p3:1;   // 1 bit
};

答案 6 :(得分:4)

因为一个字节是该语言中最小的可寻址单元。

但是你可以让bool取1位,例如你有一堆 例如。在结构中,像这样:

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

答案 7 :(得分:1)

因为通常情况下,CPU以1字节为基本单元分配内存,尽管像MIPS这样的某些CPU使用4字节字。

vector以特殊方式处理boolvector<bool>每个bool分配一位。

答案 8 :(得分:1)

bool可以是一个字节 - CPU的最小可寻址大小,也可以更大。出于性能目的,将bool设置为int的大小并不罕见。如果出于特定目的(比如硬件模拟),您需要一个具有N位的类型,您可以找到一个库(例如GBL库具有BitSet<N>类)。如果你关心bool的大小(你可能有一个大容器),那么你可以自己打包,或者使用std::vector<bool>来为你做这些(小心后者,因为它不满足容器要求。)

答案 9 :(得分:1)

即使可能的最小大小为1字节,您也可以在1字节上获得8位布尔信息:

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

Julia语言以BitArray为例,我读到了C ++实现。

答案 10 :(得分:0)

如果你的cpu是1位cpu,布尔值将是一位。

一般来说,cpu的位大小(例如8位,16位,32位等)是cpu可以操作的最小数据大小的度量 - 因此它的大小也是地址空间。 (因为指针和数据在很多层面都是一样的。)。

答案 11 :(得分:0)

字节是计算机数字数据存储的较小单位。在计算机中,RAM具有数百万字节,并且其中任何一个都具有地址。如果它的每个位都有一个地址,那么计算机可以管理8倍的RAM。

更多信息:Wikipedia

答案 12 :(得分:0)

考虑如何在模拟器级别实现此功能......

bool a[10] = {false};

bool &rbool = a[3];
bool *pbool = a + 3;

assert(pbool == &rbool);
rbool = true;
assert(*pbool);
*pbool = false;
assert(!rbool);