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

问题描述 投票:122回答:13

在C++中。

  • 为什么布尔值是1个字节而不是1位大小?
  • 为什么没有4位或2位整数这样的类型?

我在给CPU写仿真器的时候,漏掉了上面的东西。

c++ boolean byte cpu-architecture abi
13个回答
200
投票

因为CPU不能寻址小于一个字节的东西。


31
投票

维基百科:

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

所以字节是 基本寻址单元,低于计算机架构无法解决的问题。而且由于不存在(可能)支持4位字节的计算机,所以你不存在 4位 bool 等。

但是,如果你能设计出这样的架构,能够以4位为基本可寻址单元进行寻址,那么你将拥有 bool 的大小为4位,那么,在那台电脑上就只能这样了!


12
投票

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

然而在C++中是可以使用位大小分配的。有std::vector专门用于位向量,也有结构体取位大小的条目。


7
投票

在以前,当我不得不在狂风暴雪中步行上学,两边都是上坡,午餐是我们在学校后面的树林里找到的任何动物,然后徒手杀死,计算机的可用内存比现在少得多。我用过的第一台电脑有6K的内存。不是6兆字节,不是6千兆字节,是6千字节。在那个环境下,把尽可能多的booleans打包到一个int里是很有意义的,所以我们会经常使用操作把它们取出来,再放进去。

今天,当人们会嘲笑你只有1 GB的内存,而你唯一能找到小于200 GB的硬盘的地方是在一家古董店时,就不值得去打包位了。


6
投票

你可以有1位的bool和4位和2位的ints。但那会让指令集变得很奇怪,却没有性能上的提升,因为这是一种不自然的架构方式。实际上,"浪费 "一个字节中较好的部分,而不是试图回收这些未使用的数据是有意义的。

在我的经验中,唯一一个麻烦地将几个bool打包到一个字节中的应用程序是Sql Server。


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
};

5
投票

因为一个字节是语言中最小的可添加单位。

但是你可以让bool取1位,比如你在一个结构里有一堆themeeg.,像这样。

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

2
投票

bool 可以是一个字节 -- CPU的最小可寻址大小,也可以更大。这是很常见的 bool 规模为 int 以达到性能目的。如果出于特定的目的(比如硬件模拟),你需要一个N位的类型,你可以找到一个相应的库(比如GBL库有 BitSet<N> 类)。) 如果你关注的是尺寸的 bool (你可能有一个大容器,)然后你可以自己打包位,或者用 std::vector<bool> 将会为你做到这一点(小心后者,因为它不满足容器要求)。


2
投票

想一想你如何在你的模拟器层面实现这个功能......

bool a[10] = {false};

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

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

2
投票

因为在一般情况下,CPU分配内存是以1字节为基本单位的,虽然有些CPU如MIPS使用4字节的字。

但是 vector 交易 bool 以特殊的方式,与 vector<bool> 每个bool分配一个位。


0
投票

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

更多信息。维基百科


0
投票

即使最小可能的大小是1 Byte,你也可以在1 Byte上有8位布尔信息。

http:/en.wikipedia.orgwikiBit_array

比如Julia语言有BitArray,我读到过C++的实现。

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