Il est étonnamment difficile de faire la distinction entre les tas et les objets pile (ce qui est intentionnel, parce que .NET veut cacher ce détail de la mise en œuvre des programmeurs).
Une approche que vous pourriez prendre est de comparer default hash codes basée sur l'adresse d'objets en boîte, et d'observer qu'ils ne cessent de changer (demo):
static object MakeBoxed() {
int n = 5;
object a = n;
return a;
}
public static void Main() {
for (int i = 0 ; i != 10 ; i++) {
object a = MakeBoxed();
Console.WriteLine(RuntimeHelpers.GetHashCode(a));
}
}
objets créés à l'intérieur MakeBoxed
ne peut pas être sur la pile, car la pile La trame de MakeBoxed
est désactivée après l'appel. En outre, ils ne peuvent pas être dans le cadre de la pile Main
, car les cadres de pile ne se développent pas, mais tous les objets ont des adresses différentes (codes de hachage par défaut).
Est-il même possible de montrer cela de manière concluante dans le code managé? Les stratégies de gestion de la mémoire sont supposées être "invisibles" au code de l'application. Peut-être que vous devez sortir du "bac à sable de code" et regarder des choses comme des vidages mémoire du système d'exécution? – Thilo
Quel est le problème avec l'image que vous avez déjà? Je pense que tout code qui prouverait qu'il est dans le tas serait plus difficile à comprendre pour l'étudiant que le directeur général. – juharr
Utilisez le débogueur, Débogage> Windows> Mémoire> Mémoire 1. Mettez 'O' dans la zone Adresse. Affiche l'adresse où l'objet est stocké, comparez-la à l'adresse d'une autre variable d'objet, dites 'objet O2 = nouvel objet();'. Ils sont très proches les uns des autres, cela le prouve. De même, mettez '& j' dans la zone Adresse. Comparez à la valeur des registres EBP et ESP affichés par Debug> Windows> Registers. Presque la même chose, prouve que la variable unboxed est stockée sur la pile. –