6
votes

Allocation de mémoire des types de valeur et des types de référence dans .NET Framework

Y a-t-il un article avancé que je peux lire qui peut expliquer comment la mémoire est allouée pour différents types (valeur et référence) dans la framework .NET.

Par exemple, nous savons que les types de valeur sont affectés sur une pile, mais comment est-ce géré?

Comment les types de référence sont-ils gérés dans un tas et où les valeurs réelles sont stockées. (Type de référence comme n'importe quelle classe contiendra de nombreux types de valeur, où sont-ils enregistrés et comment sont-ils gérés)


0 commentaires

5 Réponses :


1
votes

Lorsqu'une méthode est appelée la quantité d'espace requise par type de valeur est connue à l'avance (elle peut être calculée par le compilateur). Cet espace est attribué sur la pile et n'est disponible que pour la durée de l'appel de la méthode. Pour chaque nouvelle méthode, appelez la mémoire utilisée sur la pile grandissant et lorsque la méthode sort, elle rétrécit son niveau précédent.

Les types de référence sont alloués sur le tas. Le tas est essentiellement un bloc de mémoire utilisé à cette fin. Un objet stocké sur le tas est principalement les champs de l'objet stocké dans la mémoire allouée à l'objet. Ainsi, les champs de type de valeur sont stockés "à l'intérieur" de l'objet sur le tas. Les champs de type de référence sont stockés comme référence (ou pointeur) sur l'objet référencé. La mémoire sur le tas est gérée par la collecte des ordures. C'est un sujet complexe, mais la nouvelle est que la mémoire allouée à des objets inutilisés sur le tas est libérée et éligible ainsi pour la réutilisation à intervalles réguliers par le collecteur des ordures.


0 commentaires

2
votes

Cet article semble avancé sans aller à la mer. Cela devrait vous fournir une bien meilleure compréhension:

http: // www.simple-tak.com/dotnet/.net-Framework/unStanding-garge-collection-in-.net/


0 commentaires

12
votes

C'est plus compliqué que vous ne le pensez peut-être. Même votre affirmation selon laquelle "les types de valeur sont allouées sur la pile" ne sont pas correctes. Par exemple: xxx

int est un type de valeur, mais la valeur de X sera toujours sur le tas, car il sera stocké avec le reste des données pour L'instance de FOO qui est une classe.

En outre, les variables capturées pour les fonctions anonymes et les blocs d'itérateur rendent la vie plus difficile.

J'ai un Article À propos de C # Heap / Stack Memory Vous pouvez également trouver utile, mais vous pouvez également lire l'article de blog d'Eric Lippert sur "La pile est un détail de mise en œuvre" < / a>. En particulier, un futur compilateur C # pourrait décider de stocker toutes ses variables locales sur le tas, à l'aide de la pile juste pour tenir une référence à une instance créée au début de la méthode ... qui ne défierait pas la spécification C # à tout.


0 commentaires

3
votes

Un type de valeur est "attribué" où il est défini.

Qu'est-ce que cela signifie dépend de l'endroit où vous le définissez:

  • dans une classe / structure, en tant que champ de cette structure, agrandissant la classe / structure en mémoire pour adapter la valeur de type valeur là-bas
  • en tant que variable locale dans une méthode, sur la pile ou en tant que registre, ou en tant que champ dans une classe générée (lors de l'utilisation de "fermetures"), en fonction des optimisations
  • comme paramètre sur une méthode, sur la pile ou en tant que registre, en fonction des optimisations

    Un type de référence est en quelque sorte une double valeur. Un type de référence est à cœur un pointeur et la valeur du pointeur suit les mêmes règles pour "allocation" comme type de valeur, mais une fois que vous stockez une valeur de la valeur, c'est-à-dire. une référence à un objet, cet objet est sur le tas ailleurs.

    En d'autres termes, la variable de référence elle-même est "allouée" comme type de valeur, mais l'objet qu'il fait référence est sur le tas.

    Lorsque vous construisez un objet à partir d'une classe, l'espace est attribué sur le tas pour adapter tous les champs de cette classe + quelques frais généraux dans cet espace.

    Je semble rappeler Jon Skeet ayant un article sur le sujet, je suis sûr qu'il va sauter avec une réponse vraiment tôt alors restez à l'écoute.


1 commentaires

Et là, il était, alors que je tapais ma réponse.



3
votes

N'oubliez pas la règle, les types de référence vont toujours au tas, tandis que les types de valeur vont toujours où ils ont été déclarés. Si un type de valeur est déclaré en dehors d'une méthode, mais à l'intérieur d'un type de référence, il sera placé dans le type de référence sur le tas.


0 commentaires