在C++中。
我在给CPU写仿真器的时候,漏掉了上面的东西。
因为CPU不能寻址小于一个字节的东西。
从 维基百科:
历史上,字节是计算机中用于编码单个文本字符的位数,正是由于这个原因。基本可寻址元素 在许多计算机架构中。
所以字节是 的 基本寻址单元,低于计算机架构无法解决的问题。而且由于不存在(可能)支持4位字节的计算机,所以你不存在 4位 bool
等。
但是,如果你能设计出这样的架构,能够以4位为基本可寻址单元进行寻址,那么你将拥有 bool
的大小为4位,那么,在那台电脑上就只能这样了!
最简单的答案是;这是因为CPU对内存的寻址是以字节为单位,而不是以位为单位,而位的操作是非常慢的。
然而在C++中是可以使用位大小分配的。有std::vector专门用于位向量,也有结构体取位大小的条目。
在以前,当我不得不在狂风暴雪中步行上学,两边都是上坡,午餐是我们在学校后面的树林里找到的任何动物,然后徒手杀死,计算机的可用内存比现在少得多。我用过的第一台电脑有6K的内存。不是6兆字节,不是6千兆字节,是6千字节。在那个环境下,把尽可能多的booleans打包到一个int里是很有意义的,所以我们会经常使用操作把它们取出来,再放进去。
今天,当人们会嘲笑你只有1 GB的内存,而你唯一能找到小于200 GB的硬盘的地方是在一家古董店时,就不值得去打包位了。
你可以有1位的bool和4位和2位的ints。但那会让指令集变得很奇怪,却没有性能上的提升,因为这是一种不自然的架构方式。实际上,"浪费 "一个字节中较好的部分,而不是试图回收这些未使用的数据是有意义的。
在我的经验中,唯一一个麻烦地将几个bool打包到一个字节中的应用程序是Sql Server。
你可以使用位字段来获得子大小的整数。
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
};
因为一个字节是语言中最小的可添加单位。
但是你可以让bool取1位,比如你在一个结构里有一堆themeeg.,像这样。
struct A
{
bool a:1, b:1, c:1, d:1, e:1;
};
bool
可以是一个字节 -- CPU的最小可寻址大小,也可以更大。这是很常见的 bool
规模为 int
以达到性能目的。如果出于特定的目的(比如硬件模拟),你需要一个N位的类型,你可以找到一个相应的库(比如GBL库有 BitSet<N>
类)。) 如果你关注的是尺寸的 bool
(你可能有一个大容器,)然后你可以自己打包位,或者用 std::vector<bool>
将会为你做到这一点(小心后者,因为它不满足容器要求)。
想一想你如何在你的模拟器层面实现这个功能......
bool a[10] = {false};
bool &rbool = a[3];
bool *pbool = a + 3;
assert(pbool == &rbool);
rbool = true;
assert(*pbool);
*pbool = false;
assert(!rbool);
因为在一般情况下,CPU分配内存是以1字节为基本单位的,虽然有些CPU如MIPS使用4字节的字。
但是 vector
交易 bool
以特殊的方式,与 vector<bool>
每个bool分配一个位。
字节是计算机数字数据存储的较小单位。在计算机中,RAM有数百万个字节,其中任何一个字节都有一个地址。如果每一个比特都有一个地址,那么计算机可以减少8倍的RAM。
更多信息。维基百科
即使最小可能的大小是1 Byte,你也可以在1 Byte上有8位布尔信息。
http:/en.wikipedia.orgwikiBit_array
比如Julia语言有BitArray,我读到过C++的实现。