Swift如何实现Array的写时复制行为?

时间:2016-04-08 03:27:18

标签: arrays swift memory wwdc

观看2后。在他们制作的photoshop示例中,他们说

  

在该图的两个实例中唯一复制的是包含该人衬衫的瓷砖。因此,即使我有两个不同的文档,旧状态和新状态,我必须消耗的唯一新数据是这个人的衬衫中包含的瓷砖。

所以我开始想知道这两个数组在内存中是怎么样的。所以我做了一点实验。

struct Test {
    var i: Int
    var j: Int
}

var valueArray = [Test(i: 1, j: 9), Test(i: 2, j: 7)]
var valueArray2 = valueArray

当我打印valueArray和valueArray2的地址时,它们不一样 “也许他们通过数组中的商店指针实现这一点?” 但是当我使用lldb打印内存时,它们实际上只是4 Int(1,9,2,7) 所以我很困惑,我还没有更改阵列。他们似乎制作了整个阵列的副本?那么我误解了哪里? 我用来打印struct的地址的函数是使用@ build better apps with value type中@nschum提供的方法。

func address(o: UnsafePointer<Void>) {
    let addr = unsafeBitCast(o, Int.self)
    print(NSString(format: "%p", addr))
}

这不是this question的重复问题。我问的是语言羽毛,另一个是编程技巧。

1 个答案:

答案 0 :(得分:0)

在你的评论之后,如果有更好的理解,我把它装在游乐场里,似乎按预期工作了

enter image description here

原始答案供参考

要记住的是结构基本上是内存中的数据块。当您创建valueArray时,正在设置一块内存来为其分配值

当您创建valueArray2时,您正在创建结构的新实例,这意味着它将拥有一个全新的内存块,然后您将设置那个新的内存块与valueArray的内存块的相同。这会在两个不同的内存位置生成数据副本。

这与一个对象形成对比,在这种情况下,valueArray将是一个指向一块内存的指针,当你创建valueArray2时,它将创建一个指向同一块内存的新指针。