2010-10-19 43 views
20

¿Alguien puede decirme cuántos bytes ocupará la cadena siguiente?¿Cuántos bytes ocupará una cadena?

string abc = "a"; 
+3

Se necesitan 17 bytes en la fuente. Por favor, especifique su pregunta un poco más. ¿Estás pensando en la memoria en tiempo de ejecución, cuando está codificado en byte [], ... –

+3

Tendrá que aclarar algunas cosas, por ejemplo: Esta cadena, ¿dónde la va a guardar? En la memoria, como el tipo de .NET "cadena"? En un archivo? ¿Con qué codificación? ¿Porque estas interesado? Si está adentro.La memoria de NET, cada cadena adicional con el mismo contenido no necesariamente usa mucha más memoria ya que la anterior puede ser reutilizada – Onkelborg

+2

Se necesita poco para que usted no se preocupe por eso :-) – paxdiablo

Respuesta

27

Desde mi article on strings:

En la implementación actual, al menos, las cadenas ocupan 20 + (n/2) * 4 bytes (redondeando el valor de n/2 abajo), donde n es el número de caracteres en la cadena. El tipo de cadena es inusual ya que el tamaño del objeto varía. Las únicas otras clases que hacen esto (hasta donde yo sé) son matrices. Básicamente, una cadena es una matriz de caracteres en la memoria, más la longitud de la matriz y la longitud de la cadena (en caracteres). La longitud de la matriz no siempre es la misma que la longitud en caracteres, ya que las cadenas se pueden "sobreasignar" dentro de mscorlib.dll, para facilitar su creación. (StringBuilder hace esto, por ejemplo). Mientras que las cadenas son inmutables al mundo exterior, el código dentro de mscorlib puede cambiar los contenidos, por lo que StringBuilder crea una cadena con una matriz de caracteres interna más grande que la requerida por el contenido actual, luego se agrega a esa cadena hasta que la matriz de caracteres ya no es lo suficientemente grande como para hacer frente, en ese punto crea una nueva cadena con una matriz más grande. El miembro de longitud de cadena también contiene una bandera en su bit superior para indicar si la cadena contiene caracteres no ASCII o no. Esto permite una optimización adicional en algunos casos.

Sospecho que fue escrito antes de que tuviera la oportunidad de trabajar con un CLR de 64 bits; Sospecho que en una extensión de 64 bits cada cadena toma 4 u 8 bytes más.

EDIT: Me escribió una blog post, más recientemente, que incluye información de 64 bits (y contradice lo anterior ligeramente para x86 ...)

+0

Bueno, hace una cadena muy impopular si quiere almacenar gran cantidad de ellos en la memoria ... –

+0

Así que una cadena de 1 carácter tomará 20 bytes según su artículo. Y 20 bytes son los datos del objeto. ¿Dónde está almacenado el personaje entonces? :-) – meze

+0

@meze: No estoy seguro de lo que quiere decir con "20 bytes son los datos del objeto". ¿Podrías aclarar? También vea http://msmvps.com/blogs/jon_skeet/archive/2011/04/05/of-memory-and-strings.aspx para obtener información más reciente: agregaré eso en. –

1

Si le preguntas sobre el tamaño del objeto string entonces está mal para preguntar acerca de su tamaño, sin depurador, es imposible decir qué es exactamente. No estoy seguro de que sea posible con el depurador tampoco. string usa punteros internos.

Si preguntas sobre el tamaño de la secuencia de caracteres que contiene, entonces es 4, porque las cadenas se almacenan en UTF-16. Todos los caracteres del plano multilingüe básico están codificados con dos bytes.

9

Básicamente, cada objeto de cadena requiere una constante de 20 bytes para los datos del objeto. El búfer requiere 2 bytes por carácter. La estimación de uso de memoria para cadena en bytes: 20 + (2 * Longitud). Entonces, normalmente La memoria en CLR para esta cadena: 22 bytes

Sin embargo, mientras pasamos o enviamos esta cadena a otro extremo o en cualquier otro uso, no necesitamos tanta memoria (nunca necesitamos los 20 bytes para los datos del objeto). Entonces depende del tipo de codificación que seleccione, mientras lo usa.

Para una codificación predeterminada, tomará 1 byte para un carácter.

Así que la respuesta es de 1 byte para la codificación predeterminada.

Usted puede comprobar con este código:

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. 
+0

Eso no importa. Depende del tipo de codificación que seleccione, cuando los use. –

+1

Eso es mejor. Se eliminó el voto. –

Cuestiones relacionadas