Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Swift array.capacity vs array.count_Arrays_Swift - Fatal编程技术网

Arrays Swift array.capacity vs array.count

Arrays Swift array.capacity vs array.count,arrays,swift,Arrays,Swift,我了解array.count(数组中的元素数)。count对于迭代数组的元素很有用。我大致了解了数组的要点 一个整数值,表示所选元素的总数 阵列可以存储而无需重新分配(只读) 实验 我一直在操场上玩,发现阵列的容量是偶数(增加2) 问题 阵列容量的用途是什么?请举一个具体的例子 阵列容量的用途是什么 基本上,阵列容量没有外部用途。它是供斯威夫特内部使用的。如果您知道将为此数组分配100个对象,那么可以在创建数组时预先设置容量,我在代码中看到过一些人这样做;但这样做没有特别的必要,也没有特别的好处

我了解array.count(数组中的元素数)。count对于迭代数组的元素很有用。我大致了解了数组的要点

一个整数值,表示所选元素的总数 阵列可以存储而无需重新分配(只读)

实验

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

问题

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

阵列容量的用途是什么


基本上,阵列容量没有外部用途。它是供斯威夫特内部使用的。如果您知道将为此数组分配100个对象,那么可以在创建数组时预先设置容量,我在代码中看到过一些人这样做;但这样做没有特别的必要,也没有特别的好处。你在引擎盖下看到了一些你不需要看到的东西。现在您已经看到了,可以忘记它了。

特别是阵列的容量,它的
reserveCapacity
方法允许您在阵列中预先分配空间

如果向数组中添加元素时超出了其容量,则该数组必须增加其容量。由于Swift阵列在内存中连续存储其元素,因此它必须重新分配其内部存储器,并(通常)将其所有元素从旧存储器复制到新存储器。(请注意,
NSArray
并没有文档化以连续存储其元素,但我们可以根据
WithUnsafemtableBufferPointer
方法的存在推断Swift数组可能存在。)

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

我能想到的询问阵列容量的唯一原因是了解系统如何工作,以及调试性能问题

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

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


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

阵列可以包含的元素总数,而无需重新分配

分配新存储

每个数组都保留一定量的内存来保存其内容。当您向数组中添加元素时,该数组开始超过其保留容量,该数组将分配更大的内存区域,并将其元素复制到新的存储器中。新存储器是旧存储器大小的倍数。这种指数增长策略意味着追加一个元素的时间是恒定的,平均了许多追加操作的性能。触发重新分配的追加操作会带来性能损失,但随着阵列的增大,它们发生的频率越来越低

下面的示例从数组文本创建一个整数数组,然后附加另一个集合的元素。在追加之前,阵列会分配足够大的新存储空间来存储生成的元素

var numbers = [10, 20, 30, 40, 50]

numbers.count == 5

numbers.capacity == 5

numbers.append(contentsOf: stride(from: 60, through: 100, by: 10))

numbers.count == 10

numbers.capacity == 12

好吧,这只是一种预先分配内存空间的方法。不过,你可以通过谷歌搜索找到答案。这不是一个很好的问题。还有,为什么你需要知道?“count还不够好吗?”“既然你已经看到了,你可以忘记它。”:)你能举个例子说明它如何对外用有用吗?@raychenon为什么?有了NSArray,苹果开发人员特别不鼓励使用具有容量的阵列,而只是让所有东西都独立工作。为什么你需要一个关于如何使用你可能永远不会使用的东西的例子?@Fogmeister,因为有人还没有证明容量是如何有用的。在我睡觉之前有个问题:)那么问题应该是:为什么苹果开发者不鼓励使用他们允许访问的东西?谷歌也不是更好。当阵列容量对性能产生重大影响时,它的概念很重要。查找阵列当前容量的功能可能仅对调试和学习有用。请结合一些上下文:
map
方法使用此功能预分配阵列,这是
map
比简单的
for in append
循环更大的性能改进之一(
map
几乎总是比in-append的等效
快。为了获得可测量的差异,您需要大约1000-1亿个元素(取决于平台)。下面的差异太小,无法准确测量。但在1000多万个元素的范围内,它确实变得非常重要,并且可能值得麻烦。我已经看到,对于非常大的阵列,改进了约30%。要明确的是:我从来没有在“真实”的情况下想到过这一点iOS应用程序,我做了很多高性能的iOS工作,我只有数字,因为我运行了测试代码的微基准来查找边缘的位置。如果你遇到这个问题,你应该已经问过你是否应该使用加速,并且可能把你的工作移到C++(这更容易重新使用)。
var numbers = [10, 20, 30, 40, 50]

numbers.count == 5

numbers.capacity == 5

numbers.append(contentsOf: stride(from: 60, through: 100, by: 10))

numbers.count == 10

numbers.capacity == 12