2017-07-21 2 views
1

Je peux concaténer deux chaînes dans Swift comme ceci:Est-ce que la concaténation de chaînes dans Swift fait une nouvelle copie?

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

Est-ce que cela crée une nouvelle chaîne ? (Allouer un nouveau bloc de mémoire, la copie sur la chaîne d'origine, concaténer le « ! » Chaîne et retourner la nouvelle mémoire.) Ou, est-il mettre à jour la chaîne d'origine en place (seulement l'attribution d'un nouveau bloc de mémoire si le bloc d'origine peut ne correspond pas au personnage).

+2

Je pense que cela vient sous la rubrique * « pourquoi ça peut vous faire? » *. C'est un détail d'implémentation qui est sujet à changement. Vous devriez supposer que l'équipe Swift fera * la bonne chose *. – vacawama

Répondre

2

Non, il ne fait pas une nouvelle copie. Comme vous pouvez le voir, la chaîne d'origine a changé. Mais l'adresse reste la même.

string concatenation with memory address check

+6

Ce que vous imprimez est l'adresse de la variable 'str', et cela ne change pas. 'str' est une' struct String' et a des pointeurs (opaques) sur le stockage de caractères. Votre sortie ne dit rien sur la façon dont le nouveau personnage est en fait ajouté à la chaîne * stockage. * –

+0

Même si elle a fait pour cela à toujours vrai une chaîne aurait à réserver un bloc contigu de mémoire garantie pour maintenir une valeur future possible , ce qui est impossible. –

1

Comme il est dit dans la documentation de pomme: https://developer.apple.com/documentation/swift/string

dans la section des optimisations de performance: « Bien que les chaînes de Swift ont une sémantique de valeur, les chaînes utiliser une stratégie de copie en écriture pour stocker leurs données dans un tampon. Ce tampon peuvent ensuite être partagées par différentes copies d'une chaîne. est uniquement copié les données d'une chaîne paresseusement, sur mutation, lorsque plus d'une instance de chaîne utilise le même tampon. par conséquent, la première dans une séquence de les opérations de mutation peuvent coûter O (n) temps et espace. " Les IO utilisent la copie sur écriture si plus d'un processus utilise la même variable, ou a plus de 1 copie (je ne comprends pas bien cette partie), il fait une copie, mais si la variable est seulement utilisé pour 1 processus et n'a qu'une seule copie, vous pouvez muter comme vous le souhaitez sans générer des copies