Swift中的字符串连接是否会生成新副本?

时间:2017-07-21 12:39:56

标签: swift string string-concatenation

我可以像这样在Swift中连接两个字符串:

var c = "Hello World" c += "!"

这会创建一个 new 字符串吗? (分配一个新的内存块,复制原始字符串,连接“!”字符串并返回新内存。)或者,它是否更新原始字符串(如果原始块可以分配新的内存块)不适合这个角色。

2 个答案:

答案 0 :(得分:2)

不,它不会制作新副本。如您所见,原始字符串已更改。但地址保持不变。

string concatenation with memory address check

答案 1 :(得分:1)

正如苹果文档中所述:https://developer.apple.com/documentation/swift/string

在性能优化部分: "尽管Swift中的字符串具有值语义,但字符串使用写时复制策略将其数据存储在缓冲区中。然后,该缓冲区可以由字符串的不同副本共享。当多个字符串实例使用相同的缓冲区时,字符串的数据仅在变异时被懒惰地复制。因此,任何变异操作序列中的第一个可能花费O(n)时间和空间。"

IO使用copy-on-write,因此如果多于1个进程使用相同的变量,或者有多个副本(我不完全理解这部分),它会复制,但如果变量是仅用于1个进程且只有一个副本,然后您可以根据需要进行变异而不生成副本