J'ai trouvé quelque chose de bizarre: pour une raison quelconque, la version tableau de ceci contiendra presque toujours des 0 aléatoires après l'exécution du code suivant, ce qui n'est pas le cas de la version pointeur.Parallélisme rapide: Array vs UnsafeMutablePointer dans GCD
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
}
Y a-t-il une raison particulière à cela? Je sais que les tableaux Swift peuvent ne pas être consécutifs en mémoire, mais accéder à l'emplacement de la mémoire par rapport à chaque index une seule fois, à partir d'un seul thread ne devrait rien faire de trop drôle.
Un tableau de références d'objet est toujours une valeur, n'est-ce pas? – Raphael
J'ai aussi pensé à cela. Mais alors les zéros ne devraient pas être "aléatoires". Eh bien, l'OP ne donne pas d'exemples ... peut-être qu'ils n'ont pas trouvé le modèle. – Raphael
Oui, un tableau d'objets contient des "valeurs", mais ce sont des valeurs de type "référencé". Ils sont comme des pointeurs sur le contenu réel. La modification de la valeur "pointée" (la valeur référencée) ne nécessite pas la mise à jour du pointeur dans le tableau. Pour les types de valeur, COW effectue également une indirection interne mais le langage masque complètement cette manipulation de la mémoire. Cela peut prêter à confusion, mais vous obtenez une double indirection pour les types de valeur et une indirection triple pour les types référencés. Les pointeurs dangereux en comparaison sont une seule indirection. –