L'allocation de la mémoire de la classe des objets
J'ai été demandé à cette question dans l'interview. Merci de m'aider à trouver la réponse.
Supposons que vous avez une classe de l'Employé. Il y a 2 variables dans il - 1. Nom De La Chaîne 2. Int Age
Maintenant, Employee emp = new Employee();
Maintenant, les Questions posées sont :
- Où l'objet emp stockées dans la mémoire je.e dans la pile ou le tas et comment ?
- Où le nom et l'âge des variables stockées dans la mémoire et comment?
- Ce que chaque mot de cette déclaration dois-je.e qu'est employé le faire..alors emp..alors =.. puis de nouveau.. personnel.. alors ()..alors ;
- Quelle est la différence entre la déclaration ci-dessus et des Employés d'emp; ? Dire en termes d'allocation de mémoire.?
S'il vous plaît répondre avec votre précieux commentaires.
Je vais vous donner des conseils et des astuces, mais je ne vais pas écrire une ligne de code pour vos devoirs.
Check this out : red-gate.com/community/books/... Il y a une version libre de PDF que vous pouvez télécharger.
Aussi un autre très bonne ressource est
Check this out : red-gate.com/community/books/... Il y a une version libre de PDF que vous pouvez télécharger.
Aussi un autre très bonne ressource est
CLR via C#, 4th Edition
shop.oreilly.com/product/0790145353665.do eh Bien la peine de faire un achat.OriginalL'auteur nitika tangri | 2013-03-20
Vous devez vous connecter pour publier un commentaire.
La question est mal formulé.
emp
n'est pas un objet;emp
est un variable qui contient une référence à un objet.Donc, nous allons reformuler la question:
L'objet référencé par la variable
emp
est stocké dans le stockage à long terme, aussi connu comme "le tas".La question ne donne pas assez d'informations pour dire. Variable
emp
pourrait être un champ statique, le champ d'instance, ou une variable locale. (Il ne peut pas être un paramètre formel parce que du point-virgule.) Si un local, il pourrait également être fermé plus de extérieur variable d'un lambda, ou un local d'un itérateur de bloquer ou d'une méthode asynchrone. L'ensemble de ces changerait si la variable de stockage est à court terme ou à long terme de stockage. Si c'est dans l'entreposage à court terme, il pourrait être sur la pile ou elle pourrait être un registre.Car ils sont des champs d'une classe, les emplacements de stockage associés à ces variables sont toujours sur le long terme tas.
Depuis
name
est de typestring
, la chose qu'il désigne -- une chaîne de caractères -- est aussi sur le tas. (Ou, la variable peut être null, auquel cas il ne fait pas référence à quoi que ce soit.)La question est très mal formulée. Tout d'abord, ce ne sont pas des "mots", ce sont des "jetons". (Et
()
est deux jetons.) Deuxièmement, il est tout à fait clair que la question veut dire par "faire". Donc, posons-nous une autre question:Nous ne pouvons pas dire avec précision car il n'y a pas assez d'informations dans la question. La question dit que c'est une déclaration, de sorte qu'il n'est pas un champ de la déclaration. Supposons pour simplifier qu'il n'est pas dans un itérateur de bloquer ou de méthode asynchrone, et que le local n'est pas une variable externe de toute fonction anonyme.
D'abord, à court terme de stockage est alloué pour la variable; il est susceptible d'être enregistered; si non, il va être sur la pile. Il est affecté d'une référence null.
Deuxième, l'allocateur de mémoire est demandé de produire le vide de la mémoire pour une instance de l'Employé sur le tas. Il le fait et produit une référence à la mémoire.
Troisième, si c'est la première fois que nous avons vu sur les Employés et a un constructeur statique, le constructeur statique fonctionne.
Quatrième, après la statique ctor terminée, l'Employé champ des initialiseurs d'exécuter.
Cinquième, l'Employé constructeur de classe de base s'exécute. Cela pourrait causer d'autres constructeurs statiques à exécuter.
Sixième, l'Employé constructeur de corps fonctionne.
Septième, le constructeur se termine et la référence à la initialisé objet est copié dans l'espace de stockage.
Tout cela suppose bien sûr que rien ne le long de la voie a déclenché une exception.
La question ne contiennent pas suffisamment d'informations pour donner une réponse précise. Si la variable locale n'est jamais utilisée, alors le compilateur est libre pour l'optimiser à l'écart. Si ce n'est pas de l'optimiser à l'écart, puis le stockage pour
emp
est alloué au large de la courte durée de la piscine, initialisé à null, et n'est jamais utilisé.utile..Merci!
OriginalL'auteur Eric Lippert
Vous devriez voir: La Pile Est Un Détail d'Implémentation, La Première Partie et Partie Deux Par Eric Lippert
Sur tas, parce que c'est un type de référence depuis
Employee
est une classe.Ils sont également stockés sur le tas. Bien que l'âge est un type de valeur, mais des types de valeur sont stockées où leur conteneur de référence est stockée.
Créer une nouvelle instance de
Employee
classe nomméeemp
Employee emp;
signifie simplement de déclaration, pas instanciation. Cela signifie pas de la mémoire est allouée à l'objet et il tiendranull
.pour cela, je ne savais pas à ce sujet. Si vous le souhaitez, vous pouvez modifier la réponse avec le détail
ici, nulle référence serait poussé sur pile ou sur le tas? Parce que la réponse ci-dessus indique que l'objet serait stocké sur le tas.
son sujet de l'objet de référence , ce n'est pas l'objet, au lieu de le considérer comme quelque chose qui contient l'adresse de segment de mémoire pour l'objet. Aller à travers les articles que j'ai posté dans la réponse. Vous obtiendrez une meilleure compréhension de la matière
OriginalL'auteur Habib
Il est alloué sur tas, comme vous l'avez dit que
Employee
est unclass
. Les Classes sont alloués sur le tas.Cela dépend de comment vous les avez utilisés et peut varier entre les différents la mise en oeuvre de cadres. En général, pensez-y comme si elles se termine avec l'objet du mémoire lui-même.
Vous alloués nececssary mémoire pour le type
Employee
et de l'attribuer à l'pointeuremp
. Le pointeuremp
est poussé sur les pile ou tas, basé sur la façon dont il est utilisé.est la même que l'écriture de
Employee emp = default(Employee);
et pour les types de référence par défaut est unnull
, c'est donc égale à l'écritureEmployee emp = null;
. Donc, en termes de répartition, il y devrait de ne pas être toute la différence.Pour davantage de lecture:
C# Tas(ing) Vs Pile(ing).NET: Partie I
OriginalL'auteur Tigran