9
votes

Les listes génériques sont-elles stockées sur la pile ou le tas en C #?

sont des listes génériques stockées sur la pile ou le tas?

Exemple xxx

est myints stocké sur la pile ou le tas? Si j'ajoute un int à la liste, la boxe ou la boîte de commande se produisent-elles?


0 commentaires

3 Réponses :


7
votes

Il n'y a pas de concept de "tas" ou "pile" lors de la création d'objets en C # ou à .NET. Bien que la liste soit stockée sur le tas, c'est vraiment un détail de mise en œuvre de la façon dont le CLR gère sa mémoire.

Il n'y a pas de boxe ni de boîte de consigne ici. C'est l'avantage d'utiliser la liste Generic Liste sur le tableau non générique . Lorsqu'une nouvelle instance de Liste est créée, c'est comme si vous écrivez une classe dans le seul but de gérer une liste de int . Il n'y a même aucun casting sur les scènes lorsqu'un int est extrait de la liste.


4 commentaires

Cela pourrait être un détail de mise en œuvre, mais la spécification de la langue mentionne que les instances de types de référence sont stockées sur le tas et les types de valeur ne sont pas.


blogs. msdn.com/b/ericlippert/archive/2009/04/27/...


@Brian, mais ce n'est qu'une partie de l'histoire. Où est un champ de type de valeur d'un objet de référence stocké? Avec l'objet. Et le point plus large est qu'il pourrait tout changer dans une version future hypothétique.


@Anthony: Je sais. Je n'essayais pas d'expliquer comment les choses sont stockées. Je soulignais simplement que la spécification de la langue couvre ceci un certain nombre de fois. Veuillez noter que je n'ai pas dit que les types de valeur sont stockés sur la pile, mais simplement qu'ils n'entraînent pas une allocation de tas qui est le libellé utilisé dans la spécification.



0
votes

pour les structures telles que int , la liste générique est spécialisée et donc aucune boxe / décomposition n'est requise.

Notez que les valeurs elles-mêmes sont stockées dans une matrice de support de la liste Néanmoins.


0 commentaires

9
votes

Liste est un type de référence. En interne, il utilise t [] . Le tableau est un type de référence. Les instances de types de référence sont stockées sur le tas. Étant donné que la liste de votre exemple est une liste il ne peut contenir que int s et pas de boxe ne se produit. La boxe se produit si vous devez traiter une valeur de valeur comme type de référence.


2 commentaires

Bonjour cerveau, pouvez-vous s'il vous plaît expliquer comment exactement la répartition de la mémoire a lieu pour cette liste ? Est-ce que cela signifie que les INT ajoutés sont des types de valeur, de sorte qu'ils seront stockés sur la pile, puis lorsque la référence de myints pointera?


@Tanuja: la liste elle-même et tout son contenu sera stocké sur le tas. Votre référence indiquera l'instance de liste sur le tas. Les types de valeurs sont stockés sur le tas si elles font partie d'un type de référence (par exemple, un champ INT d'une classe) ou stockés dans un tableau.