加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 对象内存分配

发布时间:2020-12-17 03:55:51 所属栏目:百科 来源:网络整理
导读:我想知道 Ruby中的内存分配是如何工作的. 在Ruby中,我们可以打开一个类定义并添加更多的实例变量/方法.在这种情况下,新对象比现有实例需要更多内存.它如何在内部跟踪分配给实例的内存? 例如,我们有以下类定义: class MyClass def myMethod @a = 5 endend
我想知道 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和实例变量b也可以在Myclass的现有实例m中使用.

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

m.mySecondMethod

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

解决方法

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

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

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

所有这些都由VM管理(即YARV).

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

关于您的示例,变量只保存对象的引用,因此m实际上指向已分配的MyClass对象.

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

每个对象(自Object类以来由RObject备份是所有对象的默认根目录)内部包含pointer to the values of its instance variables.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读