2010-07-30 3 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 
{ 
    ... 
} 

Vous voulez apprendre comment une instance d'une classe est créée en arrière-plan. Lorsque cette déclarationComment C# crée-t-il une instance d'une classe?

MyClass myClass = new MyClass(); 

est évaluée. Qu'est-ce qui va se passer dans le backgroud? Mes instructions suivantes sont correctes ou non (pour un système d'exploitation 32 bits)?

  1. Un espace mémoire sera créé et référencé myClass; Dans l'espace mémoire ci-dessus, 4 octets sont utilisés pour la valeur int i;
  2. dans l'espace mémoire ci-dessus, 4 octets est utilisé pour la référence de string str; la valeur réelle du str est stockée dans un autre emplacement (où?)
  3. dans l'espace mémoire ci-dessus, 8 octets est utilisé pour la valeur de MyStruct mystruct (parce que MyStruct est 8 octets);
  4. dans l'espace mémoire ci-dessus, 4 octets est utilisé pour la référence de l'objet B b; la mémoire pour l'objet b sera allouée ailleurs quand elle est instanciée; Dans l'espace mémoire ci-dessus, 4 octets sont utilisés pour la référence du ArrayList myList; l'espace mémoire réel pour ArrayList myList est alloué dans un autre endroit et référencé ici comme myList;
  5. un autre 4 ou 8 octets de l'espace mémoire ci-dessus est utilisé pour les métadonnées d'objet;
  6. ...;

Répondre

2

Vous avez l'idée de base en place. À part ce que vous incluez, les détails concrets sont spécifiques à la mise en œuvre. Cependant, pour un couple de vos points:

3) La chaîne actuelle est généralement stockée dans son propre espace mémoire, comme n'importe quelle autre classe. Cependant, puisque vous utilisez un littéral de chaîne dans ce cas, il sera probablement dans le pool interne de chaîne, qui est (je crois) stocké dans le tas d'objets volumineux. Pour plus de détails sur l'internalisation de chaîne, voir String.Intern. (Si vous avez alloué la chaîne à la volée, au lieu d'utiliser un littéral, la chaîne serait stockée dans le tas géré normal de votre application.)

1

C'est à peu près tout.

La chaîne est stockée dans la table de chaînes plutôt que comme un objet flottant dans le tas. Il est important de noter qu'une seule instance de cette chaîne est instanciée, quel que soit le nombre d'instances MyClass qui sont instanciées.

1

7.un autre espace mémoire de 4 ou 8 octets est utilisé pour l'objet metadata

Ce serait 8 octets. 4 pour le syncblock et 4 pour l'information de type.

Vous pouvez trouver plus d'informations à propos de ce sujet dans ce question.

Questions connexes