根据此演示文稿(http://oud.ocaml.org/2012/slides/oud2012-paper13-slides.pdf,PDF第4页),以下两种数据结构使用不同的内存量
type t1 = { f1: float; f2:float};;
type t2 = (float * float);;
并且t1使用的内存少于t2,有人可以向我解释为什么会这样吗?
答案 0 :(得分:7)
浮点数的数组(float数组类型)具有特殊的,未装箱的,更有效的表示。这些数组由带有标记
Double_array_tag
的块的指针表示。
这是为了有效地处理大浮点数组而引入的,但这也适用于只有浮点数的记录类型。
https://realworldocaml.org/v1/en/html/memory-representation-of-values.html也是一个非常好的文档,它解释了OCaml的内部价值表示。
答案 1 :(得分:4)
除了camlspotter回答一些澄清说明:
float
的一些复合数据结构是例外。默认情况下,每个浮点数都是盒装的,即表示不是立即值,而是指向分配的双精度浮点值的指针。 OCaml优化浮点记录和数组直接存储数据,无需双重装箱。 float ref
,在底层是a ref = {mutable contents : 'a}
类型的记录仍然占用额外的空间量,即它是指向a的指针record,包含指向该单词的指针。但是,如果你定义,type float_ref = {mutable float_contents : float}
这将是一个指向直接包含浮点值的记录的指针。