跨语言的内存存储

Posted

技术标签:

【中文标题】跨语言的内存存储【英文标题】:Memory storage across languages 【发布时间】:2015-10-31 10:44:16 【问题描述】:

我是编程新手,最近了解了某些语言(c++、java、...)中对象和变量的存储是如何工作的。但是当我(在随机站点中)阅读有关存储如何在其他语言(如 ruby​​)中工作时,显然堆栈的概念不存在并且对象和变量保存在堆中。这是真的吗?

如果是这样,那么像堆栈或(其他语言的.data,.bss)这样的段在物理上不存在吗?存储是如何工作的?我不太明白内存段。

编辑:我不是在询问每种语言的内存段,我只是想知道为什么一个段存在于一种语言中,而在另一种语言中却没有。 (段在物理上不作为...段存在吗?就像 RAM 的不同部分)

【问题讨论】:

在大多数语言中,您所能保证的只是变量可以保存值。无法保证这些值保存在内存中的什么位置,或者这些值是否放置在内存中(它们可以放置在处理器寄存器或其他硬件设备中)。 你“最近发现的”只是表面上的东西。但正如你现在的问题,一个正确的答案会填满很多书。您应该多阅读现有文献,如有必要,稍后再问一个更狭窄的问题。 @deviantfan 那么,你能给我指点一些书或相关的文学作品吗?我还不明白为什么这是一个广泛的问题。 【参考方案1】:

Ruby 语言规范没有提及堆栈和/或堆。一个特定的 Ruby 实现是否碰巧使用了堆、堆栈,或者两者都不使用,完全取决于实现者。

通常,Ruby 实现每个进程使用一个堆,每个线程一个堆栈,每个纤程使用一个轻量级堆栈,但这是特定 Ruby 实现的私有内部实现细节,不会向程序员公开,也不会以任何方式保证,即它可能随时更改,恕不另行通知。并非所有实现都如此。 MagLev 为 MagLev 集群中的所有进程(和所有计算机)提供了一个分布式持久堆。 Cardinal 没有堆栈,它使用在堆上分配的延续。我相信 SmallRuby 对所有线程都使用一个 Spaghetti 堆栈。

请注意,这并不罕见。例如,C# 语言规范也没有提及堆或堆栈。 Java 语言规范或 C++ 标准也没有。

【讨论】:

C++ 标准也没有。

以上是关于跨语言的内存存储的主要内容,如果未能解决你的问题,请参考以下文章

c语言中字符型数据在内存中的存储形式是?

剖析C语言数据在内存中的存储

c语言问题:c语言中二维数组在内存中怎样存储?

内存对齐原理

C语言指针

C语言进阶——数据的存储