gpt4 book ai didi

ruby - 为什么 Ruby 倾向于按降序分配对象 ID?

转载 作者:数据小太阳 更新时间:2023-10-29 06:52:11 25 4
gpt4 key购买 nike

我注意到对象的 ID 分配方式有悖常理。一个对象创建得越早,它的对象 ID 就越大。我原以为它们会按升序分配,而不是相反。

例如:

obj1 = Object.new
obj2 = Object.new
obj3 = Object.new

p obj1.object_id # => 4806560
p obj2.object_id # => 4806540
p obj3.object_id # => 4806520

为什么它们以这样的方式分配,为什么在 Ruby 解释器运行的代码中步长为 20,而不是 1,但在 Ruby 的 irb 运行的代码中,对象 ID 之间的差异要大得多?

最佳答案

经过许多细节,ruby 分配了一 block 堆来放置对象:

1 | 2 | 3 | 4 | 5

然后按顺序遍历它们并将它们添加到空闲对象的链表中。这导致它们在链表上的顺序相反:

freelist → NULL
freelist → 1 → NULL
freelist → 2 → 1 → NULL
freelist → 3 → 2 → 1 → NULL
freelist → 4 → 3 → 2 → 1 → NULL
freelist → 5 → 4 → 3 → 2 → 1 → NULL

分配对象时,ruby 使用链表中的第一项:

object = freelist
freelist = object.next_free

所以自由列表现在看起来像:

freelist → 4 → 3 → 2 → 1 → NULL

并且进一步分配的对象将在小分配中以相反的顺序出现。

当 ruby​​ 需要分配一个新的堆 block 来存储更多对象时,您会看到 object_id 跳起来然后再次下降。

关于ruby - 为什么 Ruby 倾向于按降序分配对象 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10423406/

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