2

谁能帮我理解为什么一个对象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
4

1 回答 1

5

在 Ruby 1.8 和 1.9 中,浮点数永远不是立即数,因此所有浮点数都需要新的内存分配。

在 Ruby 2.0.0 中,在 64 位系统上,许多浮点数现在是立即数。这意味着典型的浮点数不再需要内存分配和释放,因此操作速度更快。

Ruby 将其值存储在一个指针中(32 位或 64 位,取决于平台)。它实际上使用一种技巧将立即数存储在该指针中。这就是为什么 Fixnum 只能保存 31 / 63 位的原因。

在 32 位平台上,没有聪明的方法来存储浮点数,但在 64 位平台上,可以使用第一个将该值标记为立即浮点数,其余 60 个左右来保存数据。但是,确实需要完整 64 位的浮点数不能是立即数,因此这些浮点数就像在使用实际指针之前一样存储。

可以在原始功能请求中找到有关此优化的更多信息。

于 2013-03-14T18:20:16.047 回答