【问题标题】:Swift array instances in Memory内存中的 Swift 数组实例
【发布时间】:2021-09-03 12:36:16
【问题描述】:

现在我正在观看 WWDC,了解 Swift 性能会议

在那次会议中,一张照片让我感到困惑

我知道数组在编译时无法确定它的大小,因此它们将项目实例存储在堆中,并将该项目的引用存储在堆栈中,如上(d[0]d[1]

但是该数组中的refCount 是什么(在d[0] 旁边)?

drawables数组实例的变量指针吗?

【问题讨论】:

  • “所以他们将项目实例存储在堆中,并将该项目的引用存储在堆栈中,就像上面一样 (d[0], d[1])”不是真的。是的,项目存储在堆上的存在容器中(因为这是一个数组,其选择是协议类型),但这些引用不存储在堆栈中,它们存储在数组的堆分配缓冲区中

标签: swift automatic-ref-counting


【解决方案1】:

数组是struct,因此是值类型。但是,有一些写时复制的优化,这可能是这个refCount的原因。

documentation for Array 中,它声明:

与标准库中的所有可变大小集合一样,数组使用写时复制优化。阵列的多个副本共享相同的存储,直到您修改其中一个副本。发生这种情况时,正在修改的阵列将其存储替换为自身唯一拥有的副本,然后对其进行原地修改。有时会应用可以减少复制量的优化。

还举了一个例子:

在下面的示例中,创建了一个 numbers 数组以及共享相同存储空间的两个副本。当原始 numbers 数组被修改时,它会在进行修改之前制作其存储的唯一副​​本。对数字进行了进一步修改,而两个副本继续共享原始存储。

var numbers = [1, 2, 3, 4, 5]
var firstCopy = numbers
var secondCopy = numbers

// The storage for 'numbers' is copied here
numbers[0] = 100
numbers[1] = 200
numbers[2] = 300
// 'numbers' is [100, 200, 300, 4, 5]
// 'firstCopy' and 'secondCopy' are [1, 2, 3, 4, 5]

所以在数组变异之前,数组的存储是共享的。这就是为什么它需要对引用进行计数,而不是释放仍然可能被另一个变量使用的数组。

【讨论】:

  • @MartinR 我指的是refCount旁边的d[0]而不是LinePoint
  • @PrepareFor:是的,我已经注意到并删除了评论。很抱歉造成混乱。
  • @MartinR 哦!我不知道。也谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多