7

我知道浮点数通常在 OCaml 中装箱,但我的困难是这个词:通常。他们什么时候不装箱?而且,如果它们没有被装箱,它们是如何表示的,以便运行时将它们识别为与整数或指针不同?

我找到了http://caml.inria.fr/pub/old_caml_site/ocaml/numerical.html,它列出了浮动没有装箱的某些时间,但它已经 11 岁了,所以我不知道它是否还在-迄今为止,它没有解释它们在没有装箱时是如何表示的。

我是 OCaml 的新手,如果这是一个愚蠢的菜鸟问题,我很抱歉。谢谢!

4

3 回答 3

7

浮点数在数组中以及在所有字段都是浮点数的记录中时被取消装箱。对于这些情况,有一个特殊标签将集合标记为包含未装箱的浮点数。

这在 OCaml 手册的第 19.3 节中有描述。

于 2013-09-23T16:30:28.170 回答
4

浮动在两种情况下被拆箱:

  • 当数组(即使在多态函数中)或记录中只有浮点数时(这次,只有在编译时所有字段都被确定为浮点数时)

  • 在浮点操作序列期间:编译器会注意到,在为使用它的下一个操作拆箱之前将其装箱是没有用的,因此浮点保持未装箱。在:

    let x = 
      let y = a +. b in
      y *. c
    

    该值y不会被装箱。这种优化也在 int32、int64 和 nativeint 上进行,因此它们在繁重的计算中实际上具有非常好的性能。

于 2013-09-25T11:41:52.510 回答
2

除了杰弗里的回答,请注意多态字段(碰巧被分配了一个浮点数)在“所有字段都必须是浮点数”标准中不算作浮点数

那是:

type r = { x: float; y: float; }
let a = { x = 1.0; y = 2.0; } (* unboxed *)

type 'a r = { x: 'a; y: 'a; }
let a = { x = 1.0; y = 2.0; } (* boxed *)
于 2013-09-24T13:06:51.130 回答