2009-05-22 8 views
6

C#: ¿Cuál usa más sobrecarga de memoria? ¿Una cuerda o un char que contiene una secuencia de una palabra?C#: ¿Cuál usa más sobrecarga de memoria? ¿Una cuerda o un char que contiene una secuencia de una palabra?

Sé que un char es básicamente una matriz de cada char para formar una palabra (si hay más de un carácter), pero que en última instancia le causaría más sobrecarga de memoria como cuando usa una cadena vs. longitud de una palabra?

+3

Esto suena como una pregunta de tarea pero por si acaso no ... Si tiene que elegir entre cadena o char [] para guardar memoria, probablemente no deba programar en C#. Digo esto porque la cantidad de memoria utilizada es más o menos un lavado porque un personaje almacenado en una cadena es del mismo tamaño que una tienda de caracteres en un char. – Tony

+1

¿Por qué es importante? A menos que tengas un millón de palabras, realmente no importa ... –

Respuesta

7

Depende de cuántas veces haya utilizado la cosa en cuestión. La forma en que .Net hace cadenas es que si tenía varias cadenas con el mismo valor, ese valor solo se almacena en la memoria una vez y cada variable de cadena apunta a ese valor. Sin embargo, cada matriz de caracteres utilizada tendría su propia asignación de memoria, incluso si los contenidos de la matriz de caracteres fueran idénticos.

por ejemplo

//.Net Framework allocates memory space for "word" only once, all the three variables refer to this chunk of memory 
String s1, s2, s3; 
s1 = "word"; 
s2 = "word"; 
s3 = "word"; 

//.Net Framework allocates memory for each array 
char[] c1 = new char[] { 'w','o','r','d'}; 
char[] c2 = new char[] { 'w','o','r','d'}; 
char[] c3 = new char[] { 'w','o','r','d'}; 
+0

Hmmm. ¿Y qué pasa si cambio s1 = "word2"? ¿Asignará diferentes espacios de memoria para ello? Y s2 y s3 ​​seguirán compartiendo el mismo espacio, ¿verdad? – Kirtan

+12

El comentario sobre "mismas cadenas" (también conocido como "internamiento") solo se aplica a las cadenas de su código fuente (a menos que lo solicite deliberadamente). Por lo tanto, solo usará una instancia de cadena para "palabra" ** del código fuente **, y una para "palabra2" ** del código fuente **. Pero: si construye la cadena "word2" * no desde la fuente * (concatenación, o desde la entrada del usuario, etc.), tendrá una instancia * diferente *, incluso si lo hace 200 veces (con 200 instancias). –

0

En general la cadena va a ser más eficientes como RobV señaló varias cadenas con el mismo valor de toda referencia a la misma cadena en la memoria esto se llama string interning. Esto puede tener una gran ventaja al comparar cadenas.

Si la memoria es una gran preocupación, entonces es probable que desee tener cuidado con la forma de manejar las cadenas, la concatenación puede ser muy costosa.

+0

Solo las cadenas literales se internan por defecto. –

2

Si compara el almacenamiento de memoria de string y char[], son bastante similares. Ambos están asignados en el montón (excepto cadenas literales que se crean en tiempo de compilación). Ambos contienen algunas variables (para la longitud y tal), y un área de memoria que contiene una matriz de caracteres.

Sin embargo, dependiendo de cómo se cree el string, su área de memoria puede ser mayor de lo que su longitud requiere, es decir, tiene algunos bytes no utilizados al final del área de memoria. El área de memoria de char[] siempre es exactamente tan grande como lo requieren los datos.

Si, por ejemplo, utiliza un StringBuilder para crear una cadena, y la capacidad es mayor que su longitud (pero no más de dos), devuelve un objeto string que contiene bytes no utilizados al final.

Ejemplo:

// set capacity to 8 
StringBuilder s = new StringBuilder(8); 
// put four characters in it 
s.Append("Ouch"); 
// get the string 
string result = s.ToString(); 

La variable result ahora apunta a un objeto de cadena que tiene un área de memoria para los datos de caracteres que es de 16 bytes de largo, pero sólo se usan los primeros 10 (los cuatro caracteres, además de un carácter \x0 al final).

Cuestiones relacionadas