簡體   English   中英

使用var時,Swift是否具有二次字符串連接?

[英]Does Swift have quadratic string concatenation when using var?

在Swift語言參考中,在String Mutability下,它說:

您可以通過將特定字符串分配給變量(在這種情況下可以對其進行修改)或常量(在這種情況下無法修改)來指示是否可以修改(或變異)特定字符串

我不清楚可變的“它”是變量還是

例如,如果我寫:

var s = ""
for i in 0...100 {
  s += "a"
}

它類似於創建一個NSMutableString並調用appendString 100次(即線性成本)?

或者它類似於創建一系列更大的NSString實例並將它們與stringByAppendingString組合(即二次成本)?

或者它可能會在幕后創建某種繩索結構,因此它是不可變的線性的聚合?

附加到這樣的集合(雖然String本身不是一個集合,你實際上是用它代碼附加到它的characters視圖)是線性的,而不是二次的。 Swift中的一個字符串有一個內部緩沖區,當它填滿時它的大小加倍,這意味着當你重復追加時,你會看到越來越少的重新分配。 該文檔描述了以這種方式附加為“攤銷”的O(1)操作:大多數時候附加的是O(1),但有時它需要重新分配字符串的存儲。

數組,集和詞典具有相同的行為,但是如果您知道要多次追加,也可以為數組保留特定容量(使用reserveCapacity(_:) )。


所有這些集合都使用“copy-on-write”來保證值語義。 這里, xy共享一個緩沖區:

let x = "a"
let y = x

如果你改變x ,它會獲得一個新的,唯一的緩沖區副本:

x += "b"
// x == "ab"
// y == "a"

之后, x有自己的緩沖區,因此后續的突變不需要復制。

x += "c"   // no copy unless buffer is full

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM