gpt4 book ai didi

ruby - 为什么 `Float` 没有固定的对象 ID 而 `Fixnum` 有一个?

转载 作者:数据小太阳 更新时间:2023-10-29 08:32:50 26 4
gpt4 key购买 nike

谁能帮我理解为什么 Float 的对象没有固定的 object_idFixnum 的对象有固定的 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

最佳答案

在 Ruby 1.8 和 1.9 中, float 从不是立即数,因此所有 float 都需要新的内存分配。

在 Ruby 2.0.0 中,在 64 位系统上,许多 float are now immediates .这意味着典型的 float 不再需要内存分配和释放,因此操作速度要快得多。

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

在 32 位平台上,没有存储 float 的巧妙方法,但在 64 位平台上,可以使用第一个将此值标记为立即 float ,其余 60 个左右来保存数据。不过,确实需要完整 64 位的 float 不能是立即数,因此它们的存储方式与使用实际指针之前一样。

有关此优化的更多信息可以在 original feature request 中找到.

关于ruby - 为什么 `Float` 没有固定的对象 ID 而 `Fixnum` 有一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15416986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com