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

31 浏览
0 Comments

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

在C++中,\n

    \n

  • 为什么布尔类型是1字节而不是1位?
  • \n

  • 为什么没有4位或2位整数类型?
  • \n

\n当我编写一个CPU模拟器时,我忽略了上述内容。

0
0 Comments

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

在计算机内存资源有限的早期,为了节省空间,将多个布尔值打包进一个整型变量中是很常见的做法。但是随着计算机内存容量的增加,打包布尔值变得没有必要。然而,在处理标志位时,打包布尔值仍然具有一定的意义。

现在,人们对于只有1GB RAM的计算机会嘲笑你,而硬盘容量小于200GB的情况只会出现在古董店中,因此打包位不再值得麻烦。

然而,在处理标志位时,打包布尔值仍然有一定的用处。例如,当需要设置某个对象的多个选项时,将多个布尔值进行位运算可以很方便地实现这一目的。但是,现在的做法更倾向于使用多个布尔字段,并使用简洁的代码进行判断。

打包布尔值的优点在于可以提高处理布尔值数组的效率,比如读取速度可以提高8倍。此外,可以利用位运算来加速CPU上的工作。

如果需要将大量布尔值写入文件,那么节省带宽的优势是显著的。但是这种情况下,文件必须是二进制而不是可读的,这与当前的发展方向相悖。如果写入XML文件,可以将多个布尔值打包成一个整型字段,但这与XML的设计理念相悖。类似地,可以在写入数据库之前将布尔值打包成整型。但是,将多个布尔值打包成一个字段会降低代码的可读性和可维护性。

在处理大量数据时,打包位非常有用。例如,数据库管理系统、机器学习、科学模拟等领域经常需要处理大量的布尔值。打包布尔值可以提高读取速度,并且可以利用位运算加速CPU上的工作。

然而,对于一般的应用程序来说,很少需要处理大量的布尔值。对于只有几个布尔值的应用程序来说,将它们打包成字节反而会增加CPU的负担。

在现代的CPU架构中,缓存是一种非常重要的资源。如果能够将工作集合放入缓存中,性能将会得到显著提升。对于大型的埃拉托斯特尼筛法等算法来说,打包位图是非常有益的。但是在小规模的情况下,使用解包后的bool[]更加高效。同时,通过使用SIMD指令集,可以一次处理多个元素,例如对128个布尔值进行位与操作或统计布尔值为真的个数。在AVX512指令集中,可以将布尔值与掩码进行比较,或者从内存中加载一块位图并将其用作SIMD向量元素的掩码。

不仅计算机可以进行编程,微控制器也是如此。因此,如果在资源受限的环境下需要同时处理大量的布尔值,那么打包它们可能是值得的。

总之,布尔值的大小为1字节而不是1位的原因是为了节省内存空间,并且在处理标志位时仍然具有一定的用途。但是对于一般的应用程序来说,将布尔值分别存储在不同的字段中更加直观和易于理解。

0
0 Comments

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

根据维基百科,历史上字节是用于编码计算机中的单个字符的比特数,因此它是许多计算机体系结构中的基本可寻址元素。

所以字节是基本可寻址单元,计算机体系结构不能寻址比字节更小的单位。由于可能不存在支持4位字节的计算机,因此不能有4位的布尔型等。

然而,如果你能设计一个可以寻址4位作为基本可寻址单元的体系结构,那么在那台计算机上你将拥有4位大小的布尔型。

“你将拥有4位大小的整型”-不会的,因为标准禁止CHAR_BIT小于8。如果体系结构上的可寻址单元小于8位,则C++实现只能呈现与底层硬件内存模型不同的内存模型。

你也不能有4位的布尔型,因为在C++中,无论体系结构使用什么操作码寻址,char都是最小的可寻址单位。sizeof(bool)的值必须至少为1,并且相邻的布尔型对象必须具有自己的地址,在C++中,因此实现必须使它们更大并浪费内存。这就是为什么位域作为特殊情况存在的原因:结构的位域成员不要求是单独可寻址的,因此它们可以比char更小(尽管整个结构仍然不能)。

关于C++语言规范中说char是C++中最小的可寻址单位的具体说明,最接近的具体说明可能是3.9/4:“类型T的对象表示是由类型T的对象占用的N个unsigned char对象的序列,其中N等于sizeof(T)”。显然,sizeof(bool)不能是0.5 🙂 我想一个实现可以合法地提供子字节指针作为扩展,但是“普通”的对象如布尔型,以普通方式分配,必须按照标准的规定进行操作。

我认为8位也是为了指令集而选择的。这给你256个可能的指令,足以实现一个好的CPU(如6502和Z80)。如果比特数更少,你就必须使用技巧或多个字节来实现指令,这会使CPU变得更复杂。

0
0 Comments

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

在计算机中,CPU是无法直接寻址比一个字节更小的单位的。虽然有一些x86指令(例如bt,bts,btr和btc)可以直接寻址单个位,但是在指定地址时需要以字节为单位。如果要使用位偏移量字面量,代码会变得相当冗长。

不过,我们可以将数组的开头加载到一个寄存器中,然后将相对的“位偏移量”加载到另一个寄存器中。位偏移量不限于“在一个字节内”,它可以是任意32位数。

但是这样做会浪费资源,因为对于这种情况,我们可以使用位字段(bitfields)。位字段可以将数据压缩到子字节字段中。

一些CPU/MCU(如8051)具有位可寻址的内存,可以直接寻址单个位。此外,许多架构(如ARM或PowerPC)具有用于访问位字段的指令,因此可以高效地访问单个位。

然而,除非可以创建指向位的指针,否则无法将位作为数据类型。

,布尔值的大小为1字节而不是1位,是因为CPU无法直接寻址比一个字节更小的单位。要在代码中使用位,可以通过使用位字段或特定的指令来实现单个位的访问。但是,由于位字段需要额外的存储空间来存储位数,所以不能将其转换为void*类型的指针。虽然有一些特殊的架构可以直接寻址单个位,但在通常情况下,布尔值的大小仍然是1字节。

0