gpt4 book ai didi

ocaml - OCaml 求和类型中的 int * int 与 (int * int)

转载 作者:行者123 更新时间:2023-12-02 14:27:43 31 4
gpt4 key购买 nike

type foo = A of int * int | B of (int * int)

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

let test_foo = function
| A (f, s) -> (f, s)
| B b -> b

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

最佳答案

是的,存在性能差异:

在内存中 A (23, 42) 将包含一个将其标识为 A 的标签以及两个整数 23 和 42。B (23, 42 ) 将包含一个将其标识为 B 的标记以及一个指向包含整数 2342 的元组的指针。因此,在创建 B 时,将进行一次额外的内存分配,在访问 B 内的各个值时,将进行一层额外的间接寻址。因此,如果您实际上并未将构造函数参数用作元组,则使用 A 的开销将比使用 B 少。

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

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

关于ocaml - OCaml 求和类型中的 int * int 与 (int * int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14818866/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com