web-dev-qa-db-fra.com

Combien d'octets une chaîne prendra-t-elle?

Quelqu'un peut-il me dire combien d'octets la chaîne ci-dessous prendra?

string abc = "a";
28
Mohit Kumar

De mon article sur les chaînes :

Dans l'implémentation actuelle au moins, les chaînes occupent 20+ (n/2) * 4 octets (en arrondissant la valeur de n/2 vers le bas), où n est le nombre de caractères de la chaîne. Le type de chaîne est inhabituel en ce que la taille de l'objet lui-même varie. Les seules autres classes qui font cela (pour autant que je sache) sont des tableaux. Essentiellement, une chaîne est un tableau de caractères en mémoire, plus la longueur du tableau et la longueur de la chaîne (en caractères). La longueur du tableau n'est pas toujours la même que la longueur en caractères, car les chaînes peuvent être "surallouées" dans mscorlib.dll, pour faciliter leur construction. (StringBuilder le fait, par exemple.) Alors que les chaînes sont immuables dans le monde extérieur, le code dans mscorlib peut changer le contenu, donc StringBuilder crée une chaîne avec un tableau de caractères interne plus grand que le contenu actuel ne l'exige, puis ajoute à cette chaîne jusqu'à ce que le tableau de caractères n'est plus assez grand pour faire face, à quel point il crée une nouvelle chaîne avec un tableau plus grand. Le membre de longueur de chaîne contient également un indicateur dans son bit supérieur pour indiquer si la chaîne contient ou non des caractères non ASCII. Cela permet une optimisation supplémentaire dans certains cas.

Je soupçonne que cela a été écrit avant d'avoir eu la chance de travailler avec un CLR 64 bits; Je soupçonne qu'en 64 bits, chaque chaîne occupe 4 ou 8 octets supplémentaires.

EDIT: J'ai rédigé un article de blog plus récemment qui inclut des informations 64 bits (et contredit légèrement ce qui précède pour x86 ...)

35
Jon Skeet

Fondamentalement, chaque objet chaîne nécessite une constante de 20 octets pour les données d'objet. Le tampon nécessite 2 octets par caractère. L'estimation de l'utilisation de la mémoire pour la chaîne en octets: 20 + (2 * longueur). Donc, normalement la mémoire en CLR pour cette chaîne: 22 octets

Cependant, pendant que nous transmettons ou envoyons cette chaîne à une autre fin ou dans toute autre utilisation, nous n'avons pas besoin de beaucoup de mémoire (nous n'avons jamais besoin des 20 octets pour les données d'objet). Cela dépend donc du type d'encodage que vous sélectionnez pendant que vous l'utilisez.

Pour un encodage par défaut, il faudra 1 octet pour un caractère.

La réponse est donc de 1 octet pour le codage par défaut.

Vous pouvez vérifier avec ce code:

Encoding.Default.GetBytes("a"); //It will give you a byte array of size 1.
Encoding.Default.GetBytes("ABC"); //It will give you a byte array of size 3.
10
WAP Guy

Si vous demandez la taille de l'objet string, il est faux de demander sa taille, sans débogueur, il est impossible de dire ce que c'est exactement. Pas sûr que ce soit possible avec le débogueur non plus. string utilise des pointeurs en interne.

Si vous demandez la taille de la séquence de caractères qu'il contient, il s'agit de 4, car les chaînes sont stockées en UTF-16. Tous les caractères du plan multilingue de base sont codés sur deux octets.

1
Andrey