gpt4 book ai didi

swift - 复制或分配时,swift 中的数组如何深度复制自身

转载 作者:行者123 更新时间:2023-11-28 05:45:43 25 4
gpt4 key购买 nike

我们都知道 swift 中的数组是值类型,这意味着将一个数组复制或赋值给另一个数组后,修改新数组不会影响旧数组。如:

var a = ["a", "b", "c", "d", "e"]
var b = a
b[0] = "1"
print(a[0]) // a
print(b[0]) // 1

但我想知道数组怎么会那样工作。 “var”数组的长度是动态的。通常我们必须分配一些堆内存来包含所有的值。我确实查看了 struct Array 的一些源代码,数组的下划线缓冲区是使用类实现的。但是当复制包含类或内存指针成员的结构时,默认情况下不会复制类和分配的内存。

那么一个数组如何在复制或分配给另一个数组时复制它的缓冲区呢?

最佳答案

任何struct(例如Array)的赋值都会导致结构内容的浅拷贝。 Array 没有特殊行为。存储Array 元素的缓冲区实际上并不是结构的一部分。指向该缓冲区的指针,存储在堆上, Array 结构的一部分,这意味着在分配时,缓冲区指针被复制,但它仍然指向相同的缓冲区。

Array 上的所有变异操作都会检查缓冲区是否被唯一引用。如果是,则算法继续。否则,创建缓冲区的副本,并将指向新缓冲区的指针保存到该 Array 实例,然后算法如前所述继续进行。这称为写时复制 (CoW)。请注意,它不是所有值类型的自动功能。它只是一些标准库类型(如 ArraySetDictionaryString)的手动实现的功能, 和别的)。您甚至可以自己为自己的类型实现它。

当发生 CoW 时,它不会进行任何深度复制。它将复制值,这意味着:

  • 对于值类型(structenum、元组),值是struct/enum/元组本身。在这种情况下,深拷贝和浅拷贝是一回事。
  • 对于引用类型 (class),复制的值是 reference引用的对象 未被复制。旧引用和复制引用都指向同一个对象。因此,它是一个浅拷贝。

关于swift - 复制或分配时,swift 中的数组如何深度复制自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54859973/

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