/ / Perché un `Float` non ha un id di oggetto fisso mentre un` Fixnum` ne ha uno? - rubino, rubino-2.0

Perché un `Float` non ha un id di oggetto fisso mentre un` Fixnum` ne ha uno? - rubino, rubino-2.0

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 № 1

In 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.