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

时间:2010-05-06 14:26:43

标签: c++ ram

int,char和bool通常有不同的大小。其中int> char> bool,我想。

  • 但RAM是否支持这个?
  • 它是如何构建的?
  • 它可以利用bool只有1个字节并将其存储在一个小的“寄存器”中吗?

8 个答案:

答案 0 :(得分:6)

在普通的现代计算机上,所有内存都是字节可寻址的。也就是说,RAM中的每个字节大小的存储位置都分配有唯一的编号。如果要存储一个单字节值,例如bool(尽管bool不是必需是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字节)寄存器,则从RAM加载的bool值仍将占用整个4字节寄存器,即使它在RAM中仅消耗一个字节。

答案 1 :(得分:5)

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

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

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

在bools的情况下,通常使用内存作为位图。你基本上可以将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位操作系统而不是单个操作系统指令或记忆访问。

答案 2 :(得分:1)

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

如果你想要同时维护几个位字段,你可以使用一个字节作为位域并记住像

这样的值
0x0001 
0x0010 
0x0100 
0x1000 

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

因此,例如,如果每个bool占用一个字节的空间,那么显然每个字节只使用一个比特。因此,如果将8位连接在一起,它将只占用一个字节的空间。

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

但RAM被块传入,据我所知,它比单个字节大得多。通常用至少单词测量,正常大小一次是32,64或128位。这些数字取决于平台。

答案 3 :(得分:1)

如果通过'support'表示机器中的RAM具有与每个大小匹配的本机存储单元,答案是'它取决于机器和编译器'。

现代机器通常具有最小可寻址存储大小,即8位(8/16/32/64位)的倍数。编译器可以使用任何这些大小来存储和操作数据。编译器可能优化存储和注册使用,但他们没有。

答案 4 :(得分:1)

RAM并不真正关心数据类型的大小。它只是以字节存储数据。 CPU控制基本数据类型,知道它们有多少字节。例如,在创建int时,CPU决定使用例如4或8个字节(分别为32或64位架构)

无法解决一位,但您可以创建一个自定义结构,在一个字节中存储8个布尔值。在C ++中,您可以使用位字段来利用它。

答案 5 :(得分:0)

这与RAM有什么关系?

bool可以是true或false,通常表示为0或1(1位)。 char可以具有不同的大小,具体取决于所使用的charset。 ASCII使用7位。 Unicode最多使用32位。 整数是整数,通常支持-2 ^ 31 .... 2 ^ 31-1(32位)的范围,但它们也有其他大小。

答案 6 :(得分:0)

如果你愿意,你可以使用C ++位字段,但你将成为这个星球上为数不多的人之一(技术上,位域在C中定义明确,但它们从未真正用过太多)

C ++编译器隐藏了如何访问RAM,原因很简单。在某些情况下,您希望对此进行优化,但它们非常罕见。在当今客户端PC中大量RAM的世界中,微量优化的数量并不值得。

通常,您应该相信您的(优化)编译器做正确的事情。您提供给编译器的源代码只是模糊地类似于编译器生成的机器代码。如果您的编译器是好的,那么微优化有很大帮助,这是一个神话。您必须确切地知道编译器在其优化过程中需要帮助的位置,以便比编译器更好地进行优化。如果编译器决定你的代码太复杂而无法优化,你甚至可以使事情变得更糟。

如果你想要一些技术背景:

在机器语言级别,它取决于处理器。例如,摩托罗拉680x0系列处理器允许您执行

move.l
move.w
move.b

读取和写入RAM的不同“单位”(长/字/字节)。处理器的RAM看起来不同,具体取决于它处理的指令。有些嵌入式处理器甚至可能使用4位作为其最小单元。

答案 7 :(得分:0)

大多数商用硬件都有字节可寻址内存。看得更深一些,我们看到CPU寄存器的位宽(32或64位,适用于日常用品)。然后缓存和总线在这些块上运行(64或128个字节。)您可以尝试利用这一点,但是您需要非常详细地了解硬件,并且您将自己绑定到特定平台。另一方面,你没有利用这个,因为你的编译器已经这样做了。