Qualcuno può aiutarmi a capire perché un oggetto di Float
non ha un fisso object_id
mentre un oggetto di Fixnum
ha un fisso 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
risposte:
5 per risposta № 1In Ruby 1.8 e 1.9, i float non sono mai immediati, quindi tutti i float richiedono una nuova allocazione di memoria.
In Ruby 2.0.0, su sistemi a 64 bit, molti float ora sono immediati. Ciò significa che i float tipici non richiedono più allocazione e deallocazione di memoria, quindi operazioni molto più veloci.
Ruby memorizza i suoi valori in un puntatore (32 o 64 bit, a seconda della piattaforma). In realtà utilizza un trucco per memorizzare immediatamente in quel puntatore. Questo è il motivo per cui Fixnum può contenere solo 31/63 bit.
Su piattaforme a 32 bit, non c'è un modo intelligentememorizza i float, ma su piattaforme a 64 bit, è possibile utilizzare i primi per contrassegnare questo valore come float immediato e i rimanenti 60 circa per contenere i dati. I float che richiedono i 64 bit completi non possono essere immediatamente , tuttavia, quindi questi sono memorizzati come prima di utilizzare un puntatore reale.
Maggiori informazioni su questa ottimizzazione sono disponibili nel richiesta di funzionalità originale.