在C ++中,
在为CPU编写模拟器时,我错过了上述内容
答案 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
以特殊方式处理bool
,vector<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);