Asm*_*Asm 115 c++ cpu-architecture
在C++中,
在为CPU编写仿真器时,我错过了上述内容
Pau*_*lin 183
因为CPU无法处理小于一个字节的任何内容.
Naw*_*waz 28
来自维基百科:
从历史上看,字节是用于在计算机中编码单个文本字符的位数,因此在许多计算机体系结构中是基本可寻址元素.
所以字节的 基本寻址单元,低于该计算机体系结构无法应对.并且由于没有(可能)存在支持4位字节的计算机,因此您没有4位 bool等.
但是,如果你可以设计一个可以将4位作为基本可寻址单元的架构,那么你bool只需要在那台计算机上使用4位大小!
suk*_*kru 12
最简单的答案是; 这是因为CPU以字节为单位而不是以位为单位来寻址内存,而按位操作非常慢.
但是,可以在C++中使用位大小分配.有位向量的std :: vector专门化,以及采用位大小的条目的结构.
因为字节是语言中最小的可寻址单位。
但是如果你有一堆,例如,你可以让 bool 取 1 位。在一个结构中,像这样:
struct A
{
bool a:1, b:1, c:1, d:1, e:1;
};
Run Code Online (Sandbox Code Playgroud)
回到过去,我不得不在狂暴的暴风雪中走路上学,两边上坡,午餐是我们可以在学校后面的树林中追踪到的任何动物,用我们的双手杀死,计算机的可用内存比今天.我用的第一台电脑有6K的RAM.不是6兆字节,不是6千兆字节,6千字节.在那种环境中,将尽可能多的布尔值打包到int中是很有意义的,因此我们会定期使用操作将它们取出并放入其中.
今天,当人们嘲笑你只有1 GB的RAM,并且你能找到一个低于200 GB的硬盘的唯一地方就是古董店,那么打包就不值得了.
你可以有1位bool和4位和2位整数.但这会产生一个奇怪的指令集,没有性能提升,因为这是一种不自然的方式来看待架构.实际上,"浪费"一个字节的更好部分而不是试图回收那些未使用的数据是有意义的.
根据我的经验,唯一困扰将几个bool打包成单个字节的应用程序是Sql Server.
bool可以是一个字节——CPU 的最小可寻址大小,也可以更大。bool出于性能目的而必须达到 的大小并不罕见int。如果出于特定目的(例如硬件模拟),您需要 N 位类型,您可以找到一个库(例如 GBL 库有BitSet<N>类)。如果您担心尺寸bool(您可能有一个大容器),那么您可以自己打包,或者使用std::vector<bool>它来为您完成(要小心后者,因为它不满足容器要求)。
您可以使用位字段来获取子大小的整数.
struct X
{
int val:4; // 4 bit int.
};
Run Code Online (Sandbox Code Playgroud)
虽然它通常用于将结构映射到精确的硬件预期位模式:
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
};
Run Code Online (Sandbox Code Playgroud)