gpt4 book ai didi

ruby - 对象内存分配

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:48 30 4
gpt4 key购买 nike

我想知道 Ruby 中的内存分配是如何工作的。

在Ruby 中,我们可以打开一个类定义并添加更多的实例变量/方法。在这种情况下,新对象将需要比现有实例更多的内存。它如何在内部跟踪分配给实例的内存?

例如,我们有如下的类定义:

class MyClass
def myMethod
@a = 5
end
end

我们创建了一个 MyClass 的实例:

m = MyClass.new
m.myMethod

此时,m 会被分配一些内存。现在,我们打开类定义并添加另一个实例变量 b

class MyClass
def mySecondMethod
@b = 5
end
end

这个新方法 mySecondMethod 和实例变量 bMyclass 的现有实例 m 中也可用。

调用mySecondMethod实例化并初始化b:

m.mySecondMethod

Ruby 内部是如何管理内存的?它是重新分配内存块,例如 m,还是维护某种指向新分配内存的指针?

最佳答案

答案取决于实际实现。在这里我假设你问的是 MRI .

Ruby 对象分配在 heap 上.没有stack的概念在谈论对象分配时。

堆被分成页面,每个页面由 16kb 组成。每个页面都被分割成固定大小 可以容纳 Ruby 对象的槽。一个页面可以容纳 ~408 个对象,因为每个对象(一个 RVALUE 结构)占用 40 个字节。

所有这些都由虚拟机管理(即 YARV )。

ruby heap layout来源:http://timetobleed.com/garbage-collection-slides-from-la-ruby-conference/

关于你的例子,变量只是保存对对象的引用,所以m实际上指向分配的MyClass 对象。

在内部备份 MyClass 的 C 结构 (RClass) 包含一个指向带有用户定义方法的表的指针,如 #mySecondMethod 和一个指向表的指针,表中包含其对象所具有的实例变量的名称。

每个对象(由 RObject 支持,因为 Object 类是所有对象的默认根)内部包含一个 pointer to the values of its instance variables .

新定义的 #mySecondMethod 是可用的,因为语言的动态特性以及方法查找发生在运行时的事实。

关于ruby - 对象内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21844819/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com