为什么`Float`没有固定的对象id,而`Fixnum`有一个?

时间:2013-03-14 18:09:42

标签: ruby ruby-2.0

任何人都可以帮助我理解为什么Float的对象没有固定的object_idFixnum的对象具有固定的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

1 个答案:

答案 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