为什么产品使用的内存比记录多?
Why product use more memory than record?
根据此演示文稿(http://oud.ocaml.org/2012/slides/oud2012-paper13-slides.pdf,PDF 第 4 页),以下两个数据结构使用不同数量的内存
type t1 = { f1: float; f2:float};;
type t2 = (float * float);;
而且 t1 使用的内存比 t2 少,有人可以向我解释为什么会这样吗?
http://caml.inria.fr/pub/docs/manual-ocaml/intfc.html#sec425 的 19.3.3 说:
Arrays of floating-point numbers (type float array) have a special, unboxed, more efficient representation. These arrays are represented by pointers to blocks with tag Double_array_tag
.
这是为了有效地处理大型浮点数组,但这也适用于只有浮点数的记录类型。
https://realworldocaml.org/v1/en/html/memory-representation-of-values.html 也是一个很好的文档,它解释了 OCaml 的内部值表示。
除了 camlspotter 回答几个说明:
- 在一般记录中,数组和元组使用相同数量的内存。
- 一些使用
float
的复合数据结构是例外。默认情况下,每个浮点数都是装箱的,即表示不是立即值,而是指向分配的双精度浮点值的指针。 OCaml 优化了浮点记录和数组,直接存储数据,无需双重装箱。
- 这不适用于多态记录,例如
float ref
,在引擎盖下是类型 a ref = {mutable contents : 'a}
的记录仍然占用额外数量的 space,即,它是一个指向记录的指针,其中包含一个指向单词的指针。但是,如果您定义 type float_ref = {mutable float_contents : float}
这将是指向直接包含浮点值的记录的指针。
根据此演示文稿(http://oud.ocaml.org/2012/slides/oud2012-paper13-slides.pdf,PDF 第 4 页),以下两个数据结构使用不同数量的内存
type t1 = { f1: float; f2:float};;
type t2 = (float * float);;
而且 t1 使用的内存比 t2 少,有人可以向我解释为什么会这样吗?
http://caml.inria.fr/pub/docs/manual-ocaml/intfc.html#sec425 的 19.3.3 说:
Arrays of floating-point numbers (type float array) have a special, unboxed, more efficient representation. These arrays are represented by pointers to blocks with tag
Double_array_tag
.
这是为了有效地处理大型浮点数组,但这也适用于只有浮点数的记录类型。
https://realworldocaml.org/v1/en/html/memory-representation-of-values.html 也是一个很好的文档,它解释了 OCaml 的内部值表示。
除了 camlspotter 回答几个说明:
- 在一般记录中,数组和元组使用相同数量的内存。
- 一些使用
float
的复合数据结构是例外。默认情况下,每个浮点数都是装箱的,即表示不是立即值,而是指向分配的双精度浮点值的指针。 OCaml 优化了浮点记录和数组,直接存储数据,无需双重装箱。 - 这不适用于多态记录,例如
float ref
,在引擎盖下是类型a ref = {mutable contents : 'a}
的记录仍然占用额外数量的 space,即,它是一个指向记录的指针,其中包含一个指向单词的指针。但是,如果您定义type float_ref = {mutable float_contents : float}
这将是指向直接包含浮点值的记录的指针。