Functional programming 为什么产品使用的内存多于记录?

Functional programming 为什么产品使用的内存多于记录?,functional-programming,ocaml,Functional Programming,Ocaml,根据本演示文稿(,PDF第4页),以下两种数据结构使用的内存量不同 type t1 = { f1: float; f2:float};; type t2 = (float * float);; t1使用的内存比t2少,有人能解释一下为什么会出现这种情况吗?19.3.3 of说: 浮点数数组(类型float array)有一种特殊的、不固定的、更有效的表示形式。这些数组由指向带有标记Double\u array\u tag的块的指针表示 这是为了有效地处理大浮点数组而引入的,但这也适用于仅具有浮

根据本演示文稿(,PDF第4页),以下两种数据结构使用的内存量不同

type t1 = { f1: float; f2:float};;
type t2 = (float * float);;
t1使用的内存比t2少,有人能解释一下为什么会出现这种情况吗?

19.3.3 of说:

浮点数数组(类型float array)有一种特殊的、不固定的、更有效的表示形式。这些数组由指向带有标记
Double\u array\u tag
的块的指针表示

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


这也是一个很好的文档,它解释了OCaml的内部值表示形式。

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

  • 在一般记录中,数组和元组使用相同的内存量
  • 一些使用
    float
    s的复合数据结构是例外。默认情况下,每个浮点值都是装箱的,即不是表示为立即值,而是表示为指向所分配的双精度浮点值的指针。OCaml优化浮点记录和数组以直接存储数据,而无需双重装箱
  • 这不适用于多态记录,例如,
    float ref
    ,即在引擎盖下面是类型为
    a ref={mutable contents:'a}
    的记录仍然占用额外的空间,即它是指向记录的指针,其中包含指向单词的指针。但是,如果您定义,
    type float\u ref={mutable float\u contents:float}
    这将是指向直接包含浮点值的记录的指针
    float*float
    不会统一使用比记录/数组更多的内存。在32位体系结构上,
    let zero=0.0 in(zero,zero)
    使用的内存少于
    {f1=zero;f2=zero}
    @PascalCuoq,这是一个有趣的谜!你会把答案贴出来吗?为什么会这样?干净且有充分证明的答案,太棒了!