2013-03-14 50 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

相關問題