任何人都可以帮助我理解为什么Float
的对象没有固定的object_id
而Fixnum
的对象具有固定的object-id
?
C:\>ruby -v
ruby 2.0.0p0 (2013-02-24) [i386-mingw32]
C:\>irb --simple-prompt
DL is deprecated, please use Fiddle
>> 10.object_id
#=> 21
>> 10.object_id
#=> 21
>> 10.22.object_id
#=> 18272628
>> 10.22.object_id
#=> 15089952
>> 3.14.object_id
#=> 18577176
>> 3.14.object_id
#=> 16707660
答案 0 :(得分:5)
在Ruby 1.8& 1.9,浮点数从不是即时的,因此所有浮点数都需要新的内存分配。
在Ruby 2.0.0中,在64位系统上,有许多浮点数are now immediates。这意味着典型的浮点数不需要内存分配。再分配,更快的操作。
Ruby将其值存储在指针中(32位或64位,具体取决于平台)。它实际上使用一个技巧来存储指针中的immediates。这就是Fixnum只能容纳31/63位的原因。
在32位平台上,没有聪明的方法来存储浮点数,但在64位平台上,可以使用前面的值将此值标记为立即浮点数,剩余的60左右用于保存数据。但是,需要完整64位的浮点数不能是立即的,因此这些浮点数就像使用实际指针之前一样存储。
有关此优化的更多信息,请参阅original feature request。