我知道浮点数通常是在OCaml中装箱,但我的难点是这个词:通常。他们什么时候没有盒装?并且,如果它们没有盒装,它们是如何表示的,因此运行时将它们识别为与int或指针不同?
我找到了http://caml.inria.fr/pub/old_caml_site/ocaml/numerical.html,其中列出了浮动没有装箱的某些时间,但它已经11年了,所以我不知道它是否仍然是最新的,并且它没有解释他们如何在没有盒装时被代表。
我是OCaml的新手,很抱歉,如果这是一个愚蠢的noob问题。谢谢!
答案 0 :(得分:7)
当在数组中并且在记录中所有字段都是float时,浮点数将被取消装箱。这些案例有一个特殊标记,用于将集合标记为包含未装箱的浮动。
这在OCaml手册的Section 19.3中有所描述。
答案 1 :(得分:4)
浮动在两种情况下都是未装箱的:
当数组中只有浮点数(即使在多态函数中)或记录中时(此时,只有在编译时所有字段都被确定为浮点数)
在浮点运算的序列中:编译器会注意到,在使用它进行下一次操作的拆箱之前装入一个浮点数是没用的,所以浮点数仍然是未装箱的。在:
let x =
let y = a +. b in
y *. c
值y
不会被装箱。这种优化也在int32,int64和nativeint上完成,因此它们在繁重的计算中实际上具有非常好的性能。
答案 2 :(得分:2)
除了Jeffrey的回答之外,请注意多态字段(恰好分配了一个浮点数)不计算为“所有字段必须为浮点数”标准中的浮点数。
那是:
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 *)