Ruby 为什么';“Float”是否有固定的对象id而“Fixnum”是否有?

Ruby 为什么';“Float”是否有固定的对象id而“Fixnum”是否有?,ruby,ruby-2.0,Ruby,Ruby 2.0,有人能帮我理解为什么Float的对象没有固定的object\u 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 >>

有人能帮我理解为什么
Float
的对象没有固定的
object\u 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

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

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

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

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


有关此优化的更多信息可以在中找到。

我刚刚使用MRI ruby 2.0.0进行了测试,float有固定的对象ID。不,我也使用ruby2.0.0。嗯,它必须依赖于操作系统,我使用的是OSX 10.8为什么会有这样不同的实现?:(@marc andre lafortune:你的博客真是太棒了!@fmendez:非常感谢:-)@marc Andrélafortune Grr,仅flash内容。另一方面,我不得不承认你的照片真的很了不起:)@DavidUnric:是的,我在6年前写的网站的照片库部分。绝对需要重写。。。