为什么产品比记录使用更多内存?

时间:2015-04-20 08:40:06

标签: functional-programming ocaml

根据此演示文稿(http://oud.ocaml.org/2012/slides/oud2012-paper13-slides.pdf,PDF第4页),以下两种数据结构使用不同的内存量

type t1 = { f1: float; f2:float};;
type t2 = (float * float);;

并且t1使用的内存少于t2,有人可以向我解释为什么会这样吗?

2 个答案:

答案 0 :(得分:7)

http://caml.inria.fr/pub/docs/manual-ocaml/intfc.html#sec425的19.3.3说:

  

浮点数的数组(float数组类型)具有特殊的,未装箱的,更有效的表示。这些数组由带有标记Double_array_tag的块的指针表示。

这是为了有效地处理大浮点数组而引入的,但这也适用于只有浮点数的记录类型。

https://realworldocaml.org/v1/en/html/memory-representation-of-values.html也是一个非常好的文档,它解释了OCaml的内部价值表示。

答案 1 :(得分:4)

除了camlspotter回答一些澄清说明:

  1. 在一般记录中,数组和元组使用相同数量的内存。
  2. 使用float的一些复合数据结构是例外。默认情况下,每个浮点数都是盒装的,即表示不是立即值,而是指向分配的双精度浮点值的指针。 OCaml优化浮点记录和数组直接存储数据,无需双重装箱。
  3. 这对于多态记录不起作用,例如float ref,在底层是a ref = {mutable contents : 'a}类型的记录仍然占用额外的空间量,即它是指向a的指针record,包含指向该单词的指针。但是,如果你定义,type float_ref = {mutable float_contents : float}这将是一个指向直接包含浮点值的记录的指针。