Supposons que j'ai quelques simples struct
comme ceci:Quand arrive aux types de valeur quand ils sont retirés d'une collection?
public struct WeightedInt {
public int value;
public double weight;
}
Alors disons que j'ai une collection d'instances de cette structure:
List<WeightedInt> weightedInts = new List<WeightedInt>();
Comme je comprends les types de valeurs par rapport aux types de référence, les types de valeur sont alloués sur la pile, de sorte qu'un objet de type valeur est effacé de la mémoire une fois que la fonction instanciant ledit objet se termine. Cela signifie que dans le code suivant:
void AddWeightedIntToList(int value, double weight) {
WeightedInt wint = new WeightedInt();
wint.value = value;
wint.weight = weight;
weightedInts.Add(wint);
}
une copie de la variable locale wint
est ajouté à weightedInts
alors que la variable locale elle-même est retirée de la mémoire après AddWeightedIntToList
est terminée.
Tout d'abord: est-ce correct?
Deuxièmement, où cette copie de wint
est-elle stockée? Il ne peut pas être sur la pile, puisqu'il serait alors parti une fois la fonction terminée (droite?). Est-ce que cela signifie que la copie est stockée sur le tas avec weightedInts
? Et est-ce que le garbage est collecté après avoir été supprimé, comme s'il s'agissait d'une instance d'un type de référence?
Il est certainement possible que cette question soit traitée dans un article quelque part, auquel cas, un lien vers cet article serait une réponse totalement acceptable. Je n'ai juste pas eu de chance de le trouver.
Les types de valeur ne sont PAS alloués sur la pile. Les variables locales de type valeur qui ne sont pas dans un bloc d'itérateur ou qui sont fermées par une fonction anonyme * peuvent être allouées sur la pile et sont souvent allouées sur la pile, mais ce n'est pas nécessaire. Ils pourraient être alloués sur le tas, ou ils pourraient être alloués dans des registres. –
Si vous êtes intéressé par plus d'analyse de la fausseté "les types de valeur sont alloués sur la pile", voici deux articles que j'ai écrits sur le sujet: http://blogs.msdn.com/ericlippert/archive/2009/ 04/27/the-pile-is-a-implementation-detail.aspx et http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail- part-two.aspx –