2

のオブジェクトが固定されているのに、のオブジェクトが固定Floatされていない理由を誰かが理解するのを手伝ってもらえますか?object_idFixnumobject-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
4

1 に答える 1

5

Ruby 1.8および1.9では、floatが即時になることはないため、すべてのfloatに新しいメモリ割り当てが必要です。

Ruby 2.0.0では、64ビットシステムで、多くのフロートが即時になりました。これは、一般的なフロートがメモリの割り当てと割り当て解除を必要としないことを意味し、操作がはるかに高速になります。

Rubyは、その値をポインターに格納します(プラットフォームに応じて、32ビットまたは64ビット)。実際には、トリックを使用してイミディエートをそのポインタに格納します。これが、Fixnumが31/63ビットしか保持できない理由です。

32ビットプラットフォームでは、フロートを格納する賢い方法はありませんが、64ビットプラットフォームでは、最初のプラットフォームを使用してこの値に即時フロートのフラグを付け、残りの60ビット程度を使用してデータを保持することができます。ただし、完全な64ビットを必要とするfloatは即時化できないため、実際のポインターを使用する前と同じように格納されます。

この最適化の詳細については、元の機能リクエストをご覧ください。

于 2013-03-14T18:20:16.047 に答える