为什么是一个布尔型的1字节而不是1位的大小?
在C ++中,
- 为什么是一个布尔型的1字节而不是1位的大小?
- 为什么没有像4位或2位整数那样的types?
编写CPU的模拟器时,我错过了上述的东西
因为CPU不能寻址小于一个字节的东西。
维基百科 :
在历史上,一个字节是用于在计算机中对文本的单个字符进行编码的位数,并且由于这个原因,在许多计算机体系结构中是基本的可寻址元件 。
所以字节是基本的可寻址单元 ,在其下面的计算机体系结构不能解决。 而且由于没有(可能)存在支持4位字节的计算机,所以您没有4位 bool
等。
但是,如果你能devise出这样一个可以作为基本可寻址单元的4位结构,那么你将在这台计算机上拥有4位大小的bool
!
最简单的答案是; 这是因为CPU以字节为单位寻址内存,而不是以位为单位,并且按位操作非常缓慢。
但是可以在C ++中使用位分配。 有位vector的std :: vector专门化,也构造了一些比特大小的条目。
回到过去,我不得不在一场暴风雪中步行上学,双向上山,午餐是我们在学校后面的树林里find的任何动物,用我们徒手杀死的时候,计算机的可用内存比今天。 我曾经使用的第一台电脑有6K的RAM。 不是6兆字节,不是6千兆字节,6千字节。 在这样的环境下,把尽可能多的布尔变成一个整数是很有意义的,所以我们会经常使用操作把它们拿出来放进去。
今天,当人们嘲笑你只有1 GB的内存,唯一能find一个200 GB以下的硬盘的地方就是在一家古董店里,这样做是不值得的。
你可以有1位bools和4位和2位整数。 但是这会造成一个奇怪的指令集,因为这是一种不自然的方式来看待体系结构。 “浪费”一个字节的更好部分实际上是有意义的,而不是试图回收那些未使用的数据。
根据我的经验,将几个bools打包成单个字节的唯一应用程序是Sql Server。
您可以使用位域来获取子尺寸的整数。
struct X { int val:4; // 4 bit int. };
尽pipe通常用于将结构映射到确切的硬件预期位模式:
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 };
因为一个字节是语言中最小的可寻址单元。
但是,如果你有一堆例如,你可以让布尔拿1比特。 在一个结构中,像这样:
struct A { bool a:1, b:1, c:1, d:1, e:1; };
由于一般情况下,CPU以1字节为单位分配内存作为基本单位,虽然像MIPS这样的一些CPU使用4字节的字。
然而, vector
以特殊的方式处理bool
,每个bool分配一个vector<bool>
一位。
bool
可以是一个字节 – CPU的最小可寻址大小,或可以更大。 为了达到性能目的,将bool
设为int
的大小并不罕见。 如果出于特定目的(比如硬件模拟),你需要一个N位的types,你可以find一个库(例如GBL库有BitSet<N>
类)。 如果你关心的是bool
大小(你可能有一个大容器),那么你可以自己打包,或者使用std::vector<bool>
来为你做(注意后者,因为它不会)满足集装箱需求)。
如果你的CPU是一个1位的CPU,布尔值将是一个位。
一般来说,cpu的位大小(例如8位,16位,32位等)是可以被CPU处理的最小数据大小的量度,因此它也是地址空间的大小。 (因为指针和数据在很多层面都是一样的)。
字节是计算机数字数据存储的较小单位。 在计算机中,RAM有数百万字节,其中任何一个都有一个地址。 如果每个位都有一个地址,那么计算机可以pipe理的内存less8倍。
更多信息: 维基百科
想想你将如何实现这个在你的模拟器级别…
bool a[10] = {false}; bool &rbool = a[3]; bool *pbool = a + 3; assert(pbool == &rbool); rbool = true; assert(*pbool); *pbool = false; assert(!rbool);
即使最小可能的大小是1字节,也可以在1个字节上有8位布尔信息:
http://en.wikipedia.org/wiki/Bit_array
例如Julia语言有BitArray,我读了关于C ++的实现。