You indicate whether a particular String can be modifIEd (or mutated) by assigning it to a variable (in which case it can be modifIEd),or to a constant (in which case it cannot be modifIEd)
我不清楚可变的“它”是变量还是值.
例如,如果我写:
var s = ""for i in 0...100 { s += "a"}
它类似于创建NSMutableString并调用appendString 100次(即线性成本)?
或者它类似于创建一系列更大的Nsstring实例并将它们与stringByAppendingString组合(即二次成本)?
或者它可能会在幕后创建某种绳索结构,因此它是不可变的和线性的聚合?
解决方法 附加到这样的集合(虽然String本身不是一个集合,你实际上是用它代码附加到它的字符视图)是线性的,而不是二次的. Swift中的一个字符串有一个内部缓冲区,当它填满时它的大小加倍,这意味着当你重复追加时,你会看到越来越少的重新分配.文档描述了以这种方式附加为“摊销”的O(1) *** 作:大多数时候附加的是O(1),但有时它需要重新分配字符串的存储.数组,集和词典具有相同的行为,但是如果您知道要多次追加,也可以为数组保留特定容量(使用reserveCapacity(_ :)).
所有这些集合都使用“copy-on-write”来保证值语义.这里,x和y共享一个缓冲区:
let x = "a"let y = x
如果你改变x,它会获得一个新的,唯一的缓冲区副本:
x += "b"// x == "ab"// y == "a"
之后,x有自己的缓冲区,因此后续的突变不需要复制.
x += "c" // no copy unless buffer is full总结
以上是内存溢出为你收集整理的使用var时,Swift是否具有二次字符串连接?全部内容,希望文章能够帮你解决使用var时,Swift是否具有二次字符串连接?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)