代码之家  ›  专栏  ›  技术社区  ›  Nathan Long

对象id分配是如何工作的?

  •  42
  • Nathan Long  · 技术社区  · 15 年前

    .object_id 注意到,在irb的几个连续疗程中,我得到了相同的结果:

    false.object_id // 0
    true.object_id // 2
    nil.object_id // 4
    100.object_id // 201
    

    实际上,每个整数的object\u id似乎都是((value*2)+1)。

    这给我提出了几个问题:

    1. object_id 决定了什么?其他的基本上是随机的吗?
    2. 你能(不是说你应该)写一个模糊的Ruby,在那里你使用已知的对象id来引用对象而不命名它们,比如“objectofid201+objectofid19”来表示“100+9”吗?

    更新

    利用Andrew Grimm的建议,我试图发现其他“低id”对象,但发现:

    • 正如我之前的实验所暗示的,所有奇数ID都属于数字。具体来说,id 1指向数字0,3指向1,5指向2,依此类推。
    2 回复  |  直到 5 年前
        1
  •  64
  •   sepp2k    14 年前

    在核磁共振成像中 object_id 对象的 VALUE 表示C级对象的。对于大多数物体 指向内存中存储实际对象数据的位置的指针。显然,这在多次运行期间是不同的,因为它只取决于系统决定在何处分配内存,而不取决于对象本身的任何属性。

    true , false nil Fixnum 价值 , , 还有什么 i ,是 0 , 2 , 4 i*2+1 分别。

    这样做的原因是在核磁共振仪运行的任何系统上, 0 , 4 一*2+1 对于堆上的对象永远都不是有效的地址,因此与指向对象数据的指针没有重叠。

        2
  •  32
  •   Andrew Grimm Alex Wayne    15 年前

    (value * 2) + 1 和非整数 (x * 2) 类似于 Hilbert's paradox of the Grand Hotel ,它描述了如何将无限多的客人分配到无限大的酒店。

    ObjectSpace._id2ref(object_id) . 除非你的实现没有ObjectSpace。

    推荐文章