一尘不染

Swift array.capacity与array.count

swift

我了解array.count(数组中元素的数量)。 count对迭代数组的elements很有用 。我有点理解array.capacity的要点

容量
一个整数值,表示在不重新分配的情况下阵列可以存储多少个元素(只读)。

实验

我一直在操场上玩,发现数组的容量是偶数(增加2)

var arr = [1, 2, 3 , 4, 5, 6, 7]
arr.removeLast() // capacity stays the same after a removal
println(arr.capacity) // 8
println(arr.count)    // 6

var arr = [1, 2, 3 , 4, 5, 6]
arr.removeLast()
println(arr.capacity) // 6
println(arr.count)    // 5

问题

阵列容量有什么用?请举一个具体的例子吗?


阅读 576

收藏
2020-07-07

共1个答案

一尘不染

阵列的容量(尤其是其reserveCapacity方法)可让您在阵列中预分配空间。

如果要向数组中添加元素,并且超出其容量,则该数组必须增加其容量。由于Swift数组将其元素连续存储在内存中,因此它必须重新分配其内部存储,并且(通常)将其所有元素从旧存储复制到新存储。(请注意,NSArray没有文献证明它可以连续存储其元素,但是我们可以根据withUnsafeMutableBufferPointer方法的存在来推断Swift
Array可以这样做。)

如果您 事先
知道要向阵列中添加多少个元素,则可以使用该reserveCapacity方法来预设阵列的容量,这样它就不需要执行任何重新分配(和关联的复制)。

我想问一个数组的能力的唯一原因是要学习系统的工作原理并调试性能问题。

通常,您无需担心保留容量。重新分配很少是性能问题。Swift使用(我相信)有效的重新分配计划,以便重新分配的数量在数组的最终计数中为对数。例如,如果一次添加一百万个元素,Swift最多应执行20-30个重新分配。

但是,如果您知道阵列将非常大(例如Mac上为千兆字节或iOS设备上为数十兆字节),或者您是否在性能敏感的代码路径中填充阵列(例如,填充将开始的音频缓冲区)在几秒钟内播放),您可能希望保留容量并避免重新分配。

除非您知道重新分配是一个问题,否则您可能不必担心保留容量,这是因为探查器显示它们是瓶颈,或者是因为您有其他证据(例如音频缓冲区示例中的音频故障)。

2020-07-07