在 Scala 中,不可变列表是否共享内存?
In Scala, do immutable Lists share memory?
想到不可变列表及其在递归函数中的用法,我想知道 List
是否曾经共享内存。例如,
scala> val l = List(1, 2, 3, 4)
l: List[Int] = List(1, 2, 3, 4)
scala> val k = -2 :: -1 :: 0 :: l
k: List[Int] = List(-2, -1, 0, 1, 2, 3, 4)
Do l
和 k
在这里共享任何内存,因此就像一个切片,它们之间的唯一区别是它们指向第一个和最后一个元素的指针,或者 ::
运算符实际上必须克隆列表 l
?
我对此很好奇,因为如果它们 不 共享任何内存,那不会对递归函数中的内存和 CPU 使用造成可怕的后果,那,例如,以 list.tail
或 elem :: list
作为参数结束对自己的调用?
来自 Scala 文档:
List实现了尾列表的结构共享。这意味着许多操作的内存成本为零或恒定。
想到不可变列表及其在递归函数中的用法,我想知道 List
是否曾经共享内存。例如,
scala> val l = List(1, 2, 3, 4)
l: List[Int] = List(1, 2, 3, 4)
scala> val k = -2 :: -1 :: 0 :: l
k: List[Int] = List(-2, -1, 0, 1, 2, 3, 4)
Do l
和 k
在这里共享任何内存,因此就像一个切片,它们之间的唯一区别是它们指向第一个和最后一个元素的指针,或者 ::
运算符实际上必须克隆列表 l
?
我对此很好奇,因为如果它们 不 共享任何内存,那不会对递归函数中的内存和 CPU 使用造成可怕的后果,那,例如,以 list.tail
或 elem :: list
作为参数结束对自己的调用?
来自 Scala 文档:
List实现了尾列表的结构共享。这意味着许多操作的内存成本为零或恒定。