OCaml和类型中的int*int vs(int*int)

Sta*_*tas 9 ocaml

type foo = A of int * int | B of (int * int)
Run Code Online (Sandbox Code Playgroud)

int * int(int * int)那里有什么区别?我看到的唯一区别是模式匹配:

let test_foo = function
  | A (f, s) -> (f, s)
  | B b -> b
Run Code Online (Sandbox Code Playgroud)

它只是一种语法糖吗?你如何选择使用哪一个?这两种形式之间是否有任何性能差异?

sep*_*p2k 7

是的,存在性能差异:

在内存A (23, 42)中将包含一个标识为一个的标记A,两个整数23和42. B (23, 42)将包含一个标记为a的标记B和一个指向包含整数23和元组的元组的指针42.因此,B当访问a中的各个值时,在创建一个和一个额外的间接级别时,将会有一个额外的内存分配B.因此,如果您实际上没有将构造函数参数用作元组,则使用A将比使用更少的开销B.

另一方面,test_foo每次使用A值调用时,您的函数都会创建一个新元组,但是当使用B值调用它时,它将只返回已存在于内存中的元组.所以test_foo是更便宜的操作B绝对比A.因此,如果您将构造函数的参数用作元组,并且您将对同一值执行多次,则使用B将更便宜.

因此,如果您要将构造函数参数用作元组,那么使用构造函数获取元组是有意义的,因为您可以使用较少代码的模式匹配来获取元组,并且因为它将避免必须从元组创建元组相同的值多次.在所有其他情况下,不使用元组是更可取的,因为它涉及更少的内存分配和更少的间接.