2010-07-30 23 views
9
public class MyClass 
{ 
    int i = 0; 
    string str = "here"; 
    MyStruct mystruct; 
    B b; 
    ArrayList myList = new ArrayList(10); 

    public MyClass() 
    { 
    } 
    .... 
} 

public struct MyStruct 
{ 
    public int i; 
    public float f; 
} 

public class B 
{ 
    ... 
} 

Desea conocer cómo se crea una instancia de una clase en segundo plano. Cuando se evalúa esta afirmación¿Cómo crea C# una instancia de una clase?

MyClass myClass = new MyClass(); 

. ¿Qué pasará en el backgroud? Mis siguientes declaraciones son correctas o no (para una máquina con sistema operativo de 32 bits)

  1. Se creará un espacio de memoria y se hará referencia a él como myClass;
  2. dentro del espacio de memoria anterior, 4 bytes se utiliza para el valor de int i;
  3. dentro del espacio de memoria anterior, 4 bytes se utiliza para la referencia de string str; el valor real de str se almacena en otra ubicación (¿dónde?)
  4. dentro del espacio de memoria anterior, 8 bytes se usa para el valor de MyStruct mystruct (porque MyStruct tiene 8 bytes);
  5. dentro del espacio de memoria superior, 4 bytes se utiliza para la referencia del objeto B b; la memoria para el objeto b se asignará en otro lugar cuando se instancia;
  6. dentro del espacio de memoria anterior, 4 bytes se utiliza para la referencia de ArrayList myList; el espacio de memoria real para ArrayList myList se asigna en otro lugar y se hace referencia aquí como myList;
  7. otros 4 u 8 bytes desde el espacio de memoria anterior se utilizan para metadatos de objeto;
  8. ...;

Respuesta

2

Tiene la idea básica en su lugar. Los detalles específicos de esto, aparte de lo que incluye, son específicos de la implementación. Sin embargo, para un par de sus puntos:

3) La cadena real se almacena típicamente en su propio espacio de memoria, al igual que cualquier otra clase. Sin embargo, dado que está utilizando un literal de cadena en este caso, lo más probable es que esté en el grupo interno de cadenas, que (creo) está almacenado en el montón de objetos grandes. Para obtener más información sobre el internado de cuerdas, consulte String.Intern. (Si se asigna la cadena sobre la marcha, en lugar de utilizar un literal, la cadena se almacena en el montón administrado normal de su aplicación.)

1

Eso es todo.

La cadena se almacena en la tabla de cadenas en lugar de como un objeto flotante libre en el montón. Es importante tener en cuenta que solo se instancia una instancia de esa cadena, independientemente del número de instancias de MyClass que se crean instancias.

1

7.another 4 u 8 bytes desde arriba se utiliza espacio de memoria para el objeto metadata

Sería 8 bytes. 4 para el syncblock y 4 para la información del tipo.

Puede encontrar más información sobre el tema en este question.

Cuestiones relacionadas