2013-03-14 52 views
2

任何人都可以帮助我理解为什么Float的对象没有固定的object_idFixnum的对象有固定的object-id为什么`Float`没有固定的对象ID,而`Fixnum`有一个?

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

我刚刚用MRI ruby​​ 2.0.0进行了测试,花车有固定的对象标识。 – Intrepidd 2013-03-14 18:12:50

+0

nopes,我也使用ruby2.0.0 – 2013-03-14 18:13:41

+0

那么,它必须是Os依赖,我在OSX 10.8 – Intrepidd 2013-03-14 18:15:22

回答

5

在Ruby 1.8 & 1.9,花车从不立即数,因此所有彩车需要一个新的内存分配。

在Ruby 2.0.0,在64个系统中,许多漂浮are now immediates。这意味着典型的浮点数不再需要内存分配&的重新分配,这么快的操作。

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

在32位平台上,没有聪明的方法来存储浮动数据,但在64位平台上,可以使用第一种方法将该值标记为即时浮动值,其余60个值用于存放数据。尽管如此,需要完整64位的浮点数不能是立即数,因此它们像以前一样使用实际指针进行存储。

有关此优化的更多信息,请参阅original feature request

+0

为什么这样不同的实现? :( – 2013-03-14 18:21:40

+2

@ marc-andre-lafortune:你的博客真的很厉害! – fmendez 2013-03-14 18:31:15

+0

@fmendez:非常感谢:-) – 2013-03-14 19:05:05

相关问题