RAM可以处理不同的数据类型大小吗?

tst*_*tbu 6 c++ ram

int,char和bool通常有不同的大小.我猜想int> char> bool.

  • 但是RAM甚至支持这个吗?
  • 它是如何建立起来的?
  • 它可以利用bool只有1个字节并将其存储在一个小的"寄存器"中吗?

Tyl*_*nry 6

在普通的现代计算机上,所有内存都是字节可寻址的.也就是说,RAM中的每个字节大小的存储位置都分配有唯一的编号.如果你想存储一个单字节的值,比如a bool(虽然bools 不需要是C++中的一个字节,它们通常都是),它需要一个存储位置,比如位置42.

如果你想存储大于一个字节的东西,比如说int,那么它将需要多个连续的存储位置.例如,如果您的int类型长度为16位(2个字节),则其中一半将存储在位置42中,另一半将存储在位置43中.这将推广到更大的类型.假设您有64位(8字节)long long int类型.可以跨位置42,43,44,45,46,47,48和49存储这种类型的值.

还有一些更高级的注意事项称为"对齐",某些处理器需要遵守这些注意事项.例如,处理器可能有一个规则,即一个双字节值必须从偶数地址开始,或者一个四字节值必须从可被4整除的地址开始.您的编译器将处理此细节为了你.

编译器还知道每种类型的长度,因此当它为程序生成机器代码时,它将知道每个变量的存储开始于哪个地址,并且它将知道变量存储的连续字节数.

另一方面,"寄存器"是处理器中存在的东西,而不是RAM中的东西,通常是固定大小的.处理器寄存器的一种用途是存储从RAM检索的值.例如,如果您的处理器有32位(4字节)寄存器,那么bool从RAM加载的值仍将占用整个4字节寄存器,即使它在RAM中只消耗一个字节.


Uri*_*Uri 5

计算机存储器被组织成"字",即给定大小的字节序列(通常是2个幂).通常通过这些单元读取和写入存储器,这些单元通常与寄存器的大小和CPU对算术运算符的本机支持兼容.这通常是机器的"比特额定值"的来源(例如,32位CPU,64位CPU,旧的8位视频游戏控制台).

当然,您经常需要与原始字大小不同的大小.机器指令和智能编码允许您通过应用各种位级逻辑运算符将这些单词分解为更小的单位,或通过"组合"多个单词将它们组合成更大的单位.

例如,如果你有一个32位字,你可以对像0xff0000ff这样的模式使用AND一个字来获取该字中的第一个和最后一个字节,或者使用0x0000ffff来获得第二个16位int的内容.

在bool的情况下,通常使用内存作为位图.你基本上可以将X"bools"放在一个X位字中,并通过ANDing或ORing来访问一个特定的位来对着一个引用那个bool的"mask".例如,第一位为1,第二位为2,第四位为4,等等.

在大多数机器中,不建议在两个单词之间分割较小的数据类型(这称为alighment).

当您使用更高级别的语言(如C或C++)时,通常不必担心所有这些内存组织的问题.如果分配int,short和double,编译器将生成相应的机器代码.只有在想要在动态分配的内存中巧妙地组织内容时才能直接执行此操作,例如在手动实现位图时.

使用比本机字大小更大的单元时,编译器将再次为您处理大多数事情.例如,在32位机器上,您可以轻松处理32位int操作,但是要在8位机器或16位机器上运行相同的代码,编译器将生成代码以执行较小的操作并将它们组合在一起得到结果.这部分原因通常被认为是建议在64位计算机上运行64位操作系统,因为否则您可能会执行多个指令和读/写操作来在32位操作系统上模拟64位而不是单个操作系统指令或内存访问.


jco*_*and 1

想必您的意思是缓存?只是好奇为什么您担心数据结构的大小,您是嵌入式编程吗?这通常是唯一值得担心内存占用的时间。

如果您想要同时维护多个位字段,您可以使用字节作为位字段,并记住类似的值

0x0001 
0x0010 
0x0100 
0x1000 
Run Code Online (Sandbox Code Playgroud)

每个都彼此独立,并且可以独立于其他进行检查。人们一直这样做是为了节省一点空间。这就是你想要弄清楚的吗?

例如,如果每个 bool 占用一个字节的空间,那么显然每个字节只使用一位。因此,如果将 8 位链接在一起,则只会消耗 1 个字节的空间。

但不要忘记内存中的每个变量也有某种编组(在 .NET 中比在“较低”级别语言中更明显,但总有一些东西跟踪正在使用的变量)。因此,就像 C# 的情况一样,单个字节实际上需要 3 个字节的 RAM。

但是RAM是按块传输的,据我所知,它比单个字节大得多。通常至少以字来衡量,正常大小为一次 32、64 或 128 位。这些数字取决于平台。