2017-10-15 1 views
0

Un programme sur lequel je travaille effectue une manipulation de chaînes dans laquelle le tableau de sortie contenant les mots sera le même ou plus petit que le tableau d'entrée. Par exemple, le tableau d'entrée contient 100 éléments, chaque élément est un mot (longueur varrying). Après manipulation, il n'y avait que 99 éléments. Disons que le tableau d'entrée est de 500 octets. Puis-je dire à Swift de s'assurer que le tableau de sortie a au moins 500 octets de sorte que lors de l'ajout d'éléments, il n'a pas besoin de les déplacer vers une autre partie de la mémoire avec plus de place pour les éléments plusieurs fois?Définir la capacité du tableau en nombre d'octets dans Swift

Répondre

0

Il pourrait y avoir une idée fausse. Un Array stocke des valeurs de certain type T, et chacune de ces valeurs a la même taille. Dans votre cas, un tableau de type [String] contient les valeurs de type struct String qui ont une taille fixe (comme les valeurs de tout type dans Swift).

Comment les chaînes parviennent à contenir un nombre variable de caractères dans un détail d'implémentation. Si vous examinez le code source Swift alors vous verrez que struct String contient un pointeur vers le stockage de chaîne actuel (qui est compté pour implémenter valeur sémantique avec copie sur écriture).

Ainsi, vous pouvez réserver un espace pour un donné nombre d'éléments pour éviter tableau réaffectations lorsque des éléments sont ajoutés:

var words: [String] = [] 
words.reserveCapacity(100) 

Vous pouvez également réserver de l'espace dans le stockage sous-jacente d'une chaîne pour éviter réaffectations si la chaîne est prolongée:

var word = "" 
word.reserveSpace(1000) 

Mais vous ne réserve pas la capacité dans un tableau pour contenir le nombre total de charbon acters de ses éléments de chaîne.

+0

Oui J'ai réalisé que l'erreur que j'ai faite dans la question concerne les caractères de longueur fixe au lieu des chaînes de longueur variable. Woops. – traisjames

+0

@traisjames: Je pense que vous mélangez différentes choses maintenant. Le tableau stocke les éléments de type 'String', qui est une structure de longueur fixe. Chaque 'String' utilise un tampon (opaque) pour contenir un nombre (éventuellement variable) de caractères. Ce n'est pas le tableau qui a besoin de la capacité pour le nombre total de caractères. –

+0

@Martain R: oh, donc l'empreinte mémoire d'une chaîne n'est pas limitée au nombre de caractères stockés? – traisjames