2017-10-15 196 views
0

我正在处理的程序正在执行一些字符串操作,其中包含字的输出数组将与输入数组相同或更小。例如,输入数组包含100个元素,每个元素是一个单词(变量长度)。操纵之后,只有99个元素。假设输入数组是500字节。我可以告诉Swift确保输出数组的长度至少为500个字节,以便在添加元素时不需要将它们移动到内存的不同部分,而元素多次存在更多空间?在Swift中定义数组容量(以字节数为单位)

回答

0

可能有一种误解。 Array存储某些类型的值T,并且这些值中的每一个都具有相同的大小。在你的情况下,类型为[String]的数组保存的值为,其类型为struct String,其大小固定(如Swift中任何类型的值)。

字符串如何管理在实现细节中保存可变数量的字符。 如果您检查Swift源代码,那么您会看到struct String包含 指向实际字符串存储的指针(引用计数为实现 带拷贝写入的值语义)。

所以,你可以为元素给定的号码预留空间,以避免阵列 再分配时添加的元素:

var words: [String] = [] 
words.reserveCapacity(100) 

您也可以在字符串中的底层存储预留空间,以避免重新分配 如果字符串扩展:

var word = "" 
word.reserveSpace(1000) 

但你并不在一个阵列保留持有焦炭总数 能力它的字符串元素的字符串。

+0

是的,我意识到我在问题中犯的错误是关于固定长度字符而不是可变长度字符串。 Woops。 – traisjames

+0

@traisjames:我认为你现在在混合不同的东西。该数组存储'String'类型的元素,这是一个固定长度的结构。每个'String'使用一个(不透明)缓冲区来保存一个(可能变化的)数量的字符。它不是需要容量的总数字符的数组。 –

+0

@Martain R:哦,所以String的内存占用不限于存储的字符数量? – traisjames