【问题标题】:Why doesn't a `Float` have a fixed object id while a `Fixnum` has one?为什么 `Float` 没有固定的对象 ID,而 `Fixnum` 有一个?
【发布时间】:2013-03-14 18:09:42
【问题描述】:

谁能帮我理解为什么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

【问题讨论】:

  • 我刚刚用 MRI ruby​​ 2.0.0 进行了测试,浮点数具有固定的对象 ID。
  • 不,我也在使用 ruby​​2.0.0
  • 嗯,它必须依赖于操作系统,我在 OSX 10.8 上

标签: ruby ruby-2.0


【解决方案1】:

在 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 中找到。

【讨论】:

  • 为什么会有如此不同的实现方式? :(
  • @marc-andre-lafortune:你的博客真是太棒了!
  • @fmendez:非常感谢 :-)
  • @Marc-AndréLafortune Grr,仅限 Flash 内容。另一方面,我不得不承认你的照片真的很棒:)
  • @DavidUnric:是的,我在 6 年前写的网站的照片库部分。绝对需要重写...
猜你喜欢
  • 2023-04-10
  • 2017-02-14
  • 2021-04-09
  • 1970-01-01
  • 2012-06-17
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多