我發現了一些奇怪的東西:無論出於何種原因,在下面的代碼運行後,這個數組版本幾乎總是包含隨機0,而指針版本不會。Swift並行性:在GCD中的數組vs vs不安全的可變指針
var a = UnsafeMutablePointer<Int>.allocate(capacity: N)
//var a = [Int](repeating: 0, count: N)
let n = N/iterations
DispatchQueue.concurrentPerform(iterations: iterations) { j in
for i in max(j * n, 1)..<((j + 1) * n) {
a[i] = 1
}
}
for i in max(1, N - (N % n))..<N {
a[i] = 1
}
有沒有特別的原因呢?我知道Swift數組在內存中可能不是連續的,但是從一個線程訪問相對於每個索引的內存位置只需要一次,不應該做任何有趣的事情。
對象引用數組仍然是一個值,不是嗎? – Raphael
我也想過這個。但是零不應該是「隨機的」。那麼,OP沒有舉例......也許他們只是沒有發現這種模式。 – Raphael
是的,一個對象數組包含「值」,但它們是「引用類型」值。它們就像是指向實際內容的指針。更改「指向」的值(被引用的值)不需要更新數組中的指針。對於值類型,COW也執行內部間接尋址,但是語言完全隱藏了內存操作。這可能會引起混淆,但最終會出現值類型的雙重間接和引用類型的三重間接。不安全的指針比較是單向的。 –