Answers:
因为CPU不能寻址小于字节的任何内容。
bt
,bts
,btr
并btc
可以解决单位!
bt
寻址一个字节偏移量,然后以给定的偏移量测试该位,无论指定地址时以字节为单位...位偏移量字面量都会有点罗word(打扰)。
从维基百科:
从历史上看,字节是计算机中用于编码文本的单个字符的位数,因此,它是许多计算机体系结构中的基本可寻址元素。
所以字节的 基本寻址单元,低于该计算机体系结构无法解决。并且由于(可能)不存在支持4位字节的计算机,因此您没有4位 bool
等。
但是,如果您可以设计这样一种体系结构,该体系结构可以将4位作为基本可寻址单元进行寻址,那么bool
只有该计算机具有4位的大小!
int
并char
从我的职务。
bool
,因为C是C ++中char
最小的可寻址单元,无论体系结构可以使用其自己的操作码进行寻址。必须具有至少为1的值,并且相邻对象在C ++中必须具有自己的地址,因此实现仅需使其变大并浪费内存。这就是为什么位字段作为特殊情况存在的原因:结构的位字段成员不需要可分别寻址,因此它们可以小于a (尽管整个结构仍然不能)。sizeof(bool)
bool
char
char
是C ++中最小的可寻址单元?
sizeof(bool)
不能为0.5 :-)我想一个实现可以合法地提供子字节指针作为扩展,但是以普通方式分配的“普通”对象(如bool)必须执行标准所规定的操作。
最简单的答案是:这是因为CPU用字节而不是位来寻址内存,并且按位运算非常慢。
但是,可以在C ++中使用位大小分配。位向量有std :: vector专门化,也可以构造采用位大小的条目。
在过去的日子里,我不得不在汹涌的暴风雪中上学,双向上山,午餐是我们可以在学校后面的树林中追踪并用裸手杀死的任何动物,计算机的可用内存远少于今天。我曾经使用的第一台计算机具有6K的RAM。不是6兆字节,不是6吉字节,就是6千字节。在这种环境下,将尽可能多的布尔值打包到一个int中是很有意义的,因此我们会定期使用运算将它们取出并放入。
如今,当人们嘲笑您只有1 GB的RAM,而您唯一能找到容量不足200 GB的硬盘的地方是在一家古董店时,打包这些点麻烦就不值得了。
bool
可以是一个字节-CPU的最小可寻址大小,或者可以更大。出于性能目的而必须具有bool
一定大小的情况并不少见int
。如果出于特定目的(例如硬件仿真),您需要一个N位的类型,则可以找到该类型的库(例如,GBL库具有BitSet<N>
类)。如果您担心bool
(您可能有一个大容器)的大小,那么您可以自己打包或使用std::vector<bool>
它来为您做准备(请小心后者,因为它不能满足容器的要求)。
因为通常,CPU会以1字节为基本单位分配内存,尽管某些CPU(如MIPS)使用4字节字。
但是vector
交易bool
在一个特殊的方式,与vector<bool>
每个布尔一位被分配。
lw
/ sw
的使用更为广泛。
字节是计算机数字数据存储的较小单位。在计算机中,RAM具有数百万个字节,并且每个字节都有一个地址。如果它每个位都有一个地址,那么计算机可以管理的RAM量将比它少8倍。
更多信息:维基百科
即使最小大小为1字节,也可以在1字节上包含8位布尔信息:
http://en.wikipedia.org/wiki/Bit_array
朱莉娅(Julia)语言具有BitArray,例如,我了解了有关C ++实现的信息。
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
。大多数编译器将分配一个fullunsigned int
,但是当您进行读/写操作时,它们会自行处理位纠缠。他们还自己处理模运算。这是一个unsigned small : 4
属性,其值在0到15之间,当它应该达到16时,它不会覆盖前面的位:)