2010-03-09 3 views
1

comme nous le savons les types de référence sont toujours stockés sur tas et les types de valeur sont dans la mémoire de la pile.Comment les objets (types de référence-tas) communiquent avec les variables stockées sur la pile

par exemple.

public Class A{ 
    public int myInt=10; 
    public void Display(){ 
    } 
} 

ici, si je crée objet de la classe A il va en tas et myInt va dans la pile droite ..?

maintenant, comment classe objet (tas) interagir avec myInt variable publique (pile)?

quelqu'un peut-il s'il vous plaît expliquer ..

+4

Ceci est spécifique à la langue. Si vous voulez dire spécifiquement Java ou C#, alors étiqueter la question en conséquence. – skaffman

+0

J'ai mis à jour ma réponse afin qu'elle puisse vous aider à mieux comprendre comment le code C# est exécuté par CLR. Poster ce commentaire car il n'y a pas de notification pour l'auteur de la question dans SO pour les modifications qui se produisent dans les réponses déjà postées. – RBT

Répondre

1

que nous savons types de référence sont toujours stockés dans tas

Demandez-vous: quelle partie du type de référence est stocké sur le tas? Quel genre de mémoire? En quoi consiste le type de référence?

- Principalement, il se compose de la mémoire de ses variables membres. 1)Ces sont les données stockées sur le tas. Donc, dans votre exemple, ce serait la variable myInt.

types de valeur sont uniquement stockés sur la pile (comme vous supposiez) si elles sont locales variables à l'intérieur d'une méthode, ou leurs paramètres. Voici à quoi sert la pile: stocker les variables et les paramètres locaux (et les pointeurs de retour des appels de fonction).


1) Et aussi parfois un vtable soi-disant qui stocke les adresses des fonctions virtuelles. Mais ceci n'est pas pertinent pour cette question.

4

Je crains que votre hypothèse est fausse si vous parlez .NET. Les types de valeur sont stockés uniquement sur la pile lorsqu'ils ne font pas partie d'une instance d'un type de référence. C'est à dire. votre myInt est stocké dans le cadre de n'importe quelle instance de A sur le tas.

+0

merci, mais alors où les types de valeurs vérifiables stockés, si elles font partie du type de référence .. dans l'exemple ci-dessus où serait stocké "myInt" veriable. –

+0

'myInt' est stocké en tant que champ de l'instance de' A'. C'est à dire. la valeur 10 fait partie de la mémoire sur le tas qui appartient à l'instance du type A. –

+0

ok, cela signifie que tous les types de valeur (avec tous les modificateurs d'accès) définis dans le type de référence (Class) sont mis en tas. et les variables définies dans struct sont mises en pile ...? –

0

Généralement, la localisation des variables est une tâche de compilateur.

0

Si vous créez une instance de class A, disons A obj=new A();, un objet de type A est créé sur le tas. Cet objet sur le tas constitue de l'instance varialbe myInt également sur le tas avec d'autres variables membres, s'il y en avait. Et vous faites référence à cet objet sur le tas avec une variable de référence obj qui sera sur la pile. Par exemple,

class Mainclass{ 
main(){ 
A obj=new A(); 
//......all other code...... 
} 
} 

EDIT:

incontournable pour les développeurs .net:
Memory in .Net et Reference and values.

0

Je ferai tout ce que je veux savoir.C# langue:

vous Citant:

comme nous le savons types de référence sont toujours stockés sur les types de tas et valeur sont dans la mémoire de la pile.

TL; DR; Ce n'est pas vrai. S'il vous plaît lire les détails que j'ai posté ci-dessous. Dans votre cas, l'instance d'objet de la classe A et la variable membre myInt seront stockées sur le tas indépendamment du fait que myInt est un type de valeur.

Pour résumer la façon dont les variables sont stockées sur tas et de la pile::

La pile est toujours utilisé pour stocker les deux choses suivantes:

  • La partie de référence des variables locales référence typée dans les fonctions et leurs paramètres.
  • type de valeur des variables locales et les paramètres de la méthode (de struct, ainsi que Integ ers de $, bools, caractères, DateTimes, etc.)

Les données suivantes sont stockées sur le tas:

  • Le contenu des objets de type référence.
  • Tout ce qui est structuré à l'intérieur d'un objet de type référence.

E.g.

Main() 
{ 
MyClass obj = new MyClass(); 
} 

Class MyClass 
{ 
    int32 i; 
    Dataset dst; 

    private void MyMethod(int32 j, dataset dst2) 
    { 
      int32 k; 
      Dataset dst3; 
    } 

Voici les détails d'allocation de mémoire:

  1. obj qui est une référence d'objet - Stack
  2. instance de Myclass variable à laquelle obj pointe - Managed Heap
  3. Type de valeur variable membre i - Managed Heap
  4. dst qui est une référence d'objet de dataset - Managed Heap
  5. Instance de données et dans laquelle la variable dst pointe - Managed Heap
  6. paramètre de type valeur j - pile
  7. dst2 qui est une référence d'objet du jeu de données - pile
  8. instance du jeu de données à laquelle Dst2 variable est orientée - Géré Heap
  9. Valeur Type de variable locale k - Stack
  10. dst3 qui est une référence d'objet de jeu de données - Stack
  11. instance de jeu de données auquel est dst3 pointage - tas managé

Je pense avoir couvert toutes les permutations et combinaisons.

vous Voici un autre:

maintenant, comment objet de classe (tas) interagir avec myInt variable publique (stack)?

La première chose que je veux ajouter ici est que l'objet et les variables n'interagissent pas. C'est le code (instructions IL exécutables présentes dans une méthode) qui interagissent avec les variables publiques d'une instance de classe (objet appelé).

Voir, CLR ne charge un type qu'une seule fois en mémoire. Ainsi, toutes les instructions IL correspondant à votre méthode Display seront placées en mémoire de manière centralisée quel que soit le nombre d'instances de la classe A que vous créerez dans votre programme. Seules les instances (contenant des données de variables membres) de la classe A occuperont une place différente (adresse mémoire pour être précise) dans le tas.

Chaque fois que l'instruction IL pour la méthode Display est exécutée, elle a un pointeur vers this qui est une référence à l'instance d'objet actuelle dans le segment de mémoire. this La référence est différente pour différentes instances d'objet. this pointe toujours vers la disposition d'adresse de la mémoire de départ de votre instance d'objet actuelle. De là, un décalage est nécessaire pour atteindre l'adresse de la mémoire où myInt est situé pour y accéder/le modifier. J'espère que cela vous aidera à faire un modèle mental du fonctionnement du code C# sous le capot dans l'environnement CLR.

Questions connexes