至少高于20_000_000
,object_id
的数字是数字的2倍+ 1:
1454.object_id # => 2909
在大号码上调用object_id
时,不会保留此格式。似乎理论上可以有对象数量的内置限制。我跑了:
ids = []
100_000_000.times { ids << String.new.object_id }
ids.max # => 22314984
ids.uniq.count # => 44301
因此,在100,000,000个字符串对象中,只有大约50,000个字符串实际上是唯一的。这意味着99.95%的这些对象是同一个对象。我不确定为什么会这样。
答案 0 :(得分:5)
如何分配对象ID取决于实现。在C-ruby上,对象id只是对象内存地址的数值(对于立即值有一些例外,例如true,false,nil,Fixnums)。
因此,两个活动对象不能共享相同的对象ID(好!),但是如果触发垃圾收集,那么一些内存位置(即堆槽)可能会被重用,因此对象也会被重用。
另一个结果是你永远不会耗尽对象id(除非你耗尽了进程的地址空间,但如果发生这种情况你仍然会遇到麻烦)