2010-06-19 3 views
0

Ok, j'ai toujours su que les ordinateurs traitent les chaînes comme une série de chiffres sous les couvertures, mais je n'ai jamais vraiment examiné les détails de leur fonctionnement. Quel genre de magie se passe dans le compilateur/processeur moyen lorsque nous faisons, par exemple, ce qui suit?Notions de base sur les chaînes

string myString = "foo"; 
myString += "bar"; 
print(myString) //replace with printing function of your choice 
+1

quel langage de programmation? C++? C#? –

+2

Dans quelle langue? La réponse est _entirely_ dépendante de la langue. Dans certaines langues, les chaînes sont immuables; dans d'autres, ils ne le sont pas. Certaines langues ont différents types de chaînes. –

+0

Un vrai compilateur intelligent peut même être en mesure d'arriver à la conclusion: 'print (" foobar ")' - selon la langue/exécution/obligations contractuelles et "intelligence" –

Répondre

1

La réponse dépend entièrement de la langue en question. Mais C est généralement une bonne langue pour voir comment les choses se passent dans les coulisses.

In C:

Dans les chaînes C sont réseau de char avec un 0 à la fin:

char str[1024]; 
strcpy(str, "hello "); 
strcpy(str, "world!"); 

Derrière les scènes str [0] == 'H' (qui a un valeur int), str [1] == 'e', ​​... str [11] == '!', str [12] == '\ 0'; Un caractère est simplement un nombre qui peut contenir l'une des 256 valeurs. Chaque caractère a une valeur numérique.

En C++:

chaînes sont pris en charge de la même manière que C mais vous avez aussi un type string qui fait partie de la STL.

Les littéraux de chaîne font partie du stockage statique et ne peuvent pas être modifiés directement sauf si vous souhaitez un comportement indéfini.

Son implémentation dépend de la manière dont le type de chaîne fonctionne réellement en coulisses, mais les objets chaîne eux-mêmes sont mutables.

En C#:

chaînes sont immuables. Ce qui signifie que vous ne pouvez pas changer directement une chaîne une fois créée. Quand vous faites + = ce qui se passe, une nouvelle chaîne est créée et votre chaîne référence maintenant cette nouvelle chaîne.

0

Dépendant de la langue. Cependant, dans la plupart des cas, les chaînes sont immutable, donc cela va allouer une nouvelle chaîne et libérer la mémoire de l'ancien.

0

Je suppose une faute de frappe dans votre échantillon et qu'il n'y a qu'une seule variable appelée soit foo ou myString, pas deux variables?

Je dirais que cela dépendra beaucoup du compilateur que vous utilisez. Dans les chaînes .Net, elles sont immuables. Lorsque vous ajoutez "bar", vous ne l'ajoutez pas mais créez une nouvelle chaîne contenant "foobar" et dites-lui de le mettre dans votre variable.
Dans d'autres langues, cela fonctionnera différemment.

+0

Vous avez raison, merci pour le conseil! – RCIX

1

L'implémentation varie bien sûr entre la langue et le compilateur, mais typiquement pour C c'est quelque chose comme ceci. Notez que les chaînes sont essentiellement du sucre syntaxique pour les réseaux de char (char[]) en C.

1.

string myString = "foo"; 
  • allouer 3 octets de mémoire pour la matrice et régler la valeur du premier octet à « f » (son code ASCII plutôt), le deuxième octet « o », l'octet 2rd à « o '.

2.

foo += "bar"; 
  • Lire chaîne existante (tableau de caractères) de la mémoire pointée par foo.

  • Allouer 6 octets de mémoire, remplir les 3 premiers octets avec le contenu de lecture de foo, et les 3 octets suivants avec b, a et r.

3.

print(foo) 
  • Lire la chaîne foo pointe maintenant à partir de la mémoire, et l'imprimer à l'écran.

Ceci est une vue d'ensemble assez grossière, mais devrait vous donner l'idée générale.

Side note: Dans certaines langues/compuilers, char = octet - par exemple, C#, où les chaînes sont stockées au format Unicode par défaut, et notamment la longueur de la chaîne est également stockée dans la mémoire!. C++ utilise généralement des chaînes à terminaison nulle, ce qui résout le problème d'une autre manière, bien que cela signifie que sa longueur est O (n) plutôt que O (1).

Questions connexes