私は何か不思議なことを見つけました:何らかの理由で、このバージョンの配列バージョンは、次のコードが実行された後、ほとんど常にランダムな0を含みます。スウィフトパラレル化:GCDのUnsafeMutablePointerとの比較
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
}
これには特別な理由がありますか?スウィフト配列はメモリ内で連続しているわけではないかも知れませんが、単一のスレッドから各インデックスに対してメモリ位置にアクセスするのはあまり面白くありません。
オブジェクト参照の配列はまだ値ですが、それはありませんか? – Raphael
私もこれについて考えました。しかし、ゼロは「ランダム」であってはなりません。さて、OPは例を示していません...おそらく彼らはパターンを見つけていないかもしれません。 – Raphael
はい、オブジェクトの配列には「値」が含まれていますが、これらは「参照された型」の値です。彼らは実際のコンテンツへのポインタのようなものです。 "指し示された"値(参照された値)を変更する場合は、配列内のポインタを更新する必要はありません。値型の場合、COWも内部間接を実行しますが、言語はそのメモリ操作を完全に隠します。これは混乱するかもしれませんが、値の型は二重間接指定、参照型は三重間接指定になります。比較の安全ではないポインタは単一の間接指定です。 –