Combien d'octets d'une chaîne?

quelqu'un Peut-il me dire combien d'octets de l'en-dessous de chaîne?

string abc = "a";
23
demandé sur dav_i 2010-10-19 14:31:24

3 réponses

à Partir de mon l'article sur les chaînes de caractères:

dans l'implémentation actuelle au moins, les chaînes prennent 20 + (n/2)*4 octets (arrondissant la valeur de n/2 vers le bas), où n est le nombre de caractères dans la chaîne. Le type string est inhabituelle 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 les tableaux. Essentiellement, une chaîne de caractères est un tableau de caractères en mémoire, plus la longueur du tableau et de la longueur de la chaîne (en caractère.) La longueur du tableau n'est pas toujours la même que la longueur en caractères, car les chaînes peuvent être "sur-attribuées" dans mscorlib.dll, pour les construire plus facilement. (StringBuilder fait cela, par exemple.) Tandis que les chaînes de caractères sont immuables au monde extérieur, le code dans mscorlib peut changer le contenu, donc StringBuilder crée une chaîne avec un plus grand tableau de caractères internes que le contenu actuel n'exige, puis ajoute à cette chaîne jusqu'à ce que le tableau de caractères ne soit plus grand assez pour faire face, à ce point il crée une nouvelle chaîne avec un plus grand tableau. Le membre string length contient également un drapeau 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 que j'ai eu la chance de travailler avec un 64-bit CLR; je soupçonne dans 64-bit land chaque chaîne prend soit 4 ou 8 bytes de plus.

EDIT: j'ai écrit un blog plus récemment, qui comprend des informations 64 bits (et contredit légèrement ce qui précède pour x86...)

30
répondu Jon Skeet 2015-04-01 16:26:48

fondamentalement, chaque objet string nécessite une constante de 20 octets pour les données de l'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 dans CLR pour cette chaîne: 22 octets

cependant pendant que nous passons ou envoyons cette chaîne à une autre extrémité ou dans tout autre usage, nous n'avons pas besoin de autant de mémoire(nous n'avons jamais besoin des 20 octets pour les données de l'objet). Il dépend donc du type d'encodage que vous sélectionnez, tandis que vous utiliser.

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

donc la réponse est 1 byte pour l'encodage 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.
9
répondu WAP Guy 2012-02-16 06:39:58

si vous demandez à propos de la taille de string object alors il est erroné 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 debugger non plus. string utilise des pointeurs internes.

si vous posez des questions sur la taille de la séquence de caractères qu'il contient, alors il est de 4, parce que les chaînes sont stockées en UTF-16. Tous les caractères dans le plan multilingue de base sont codés avec deux octets.

1
répondu Andrey 2010-10-19 10:39:49