46 votes

Disposition de la mémoire d'un tableau .NET

Quelle est la disposition de la mémoire d'un .NET tableau?

Prenez par exemple ce tableau:

Int32[] x = new Int32[10];

Je comprends que la majeure partie de la matrice est comme ceci:

0000111122223333444455556666777788889999

Où chaque personnage est un octet, et les chiffres correspond à un indice dans le tableau.

En outre, je sais qu'il existe un type de référence, et un syncblock-index de tous les objets, de sorte que le ci-dessus peut être adapté à cela:

ttttssss0000111122223333444455556666777788889999
        ^
        +- object reference points here

En outre, la longueur de la matrice doit être stocké, donc c'est peut-être plus correct:

ttttssssllll0000111122223333444455556666777788889999
        ^
        +- object reference points here

Est-ce terminé? Il y a plus de données dans un tableau?

La raison pour laquelle je te demande, c'est que nous essayons d'estimer la quantité de mémoire utilisée par un couple de différentes dans les représentations de la mémoire d'un grand corpus de données et de la taille des groupes varie un peu, si bien que la surcharge peut avoir un grand impact dans une solution, mais peut-être pas tant dans l'autre.

Donc en gros, pour un tableau, combien de frais généraux est là, c'est en gros ma question.

Et avant que les tableaux sont mauvais escouade se réveille, cette partie de la solution est une accumulation d'électricité statique une fois de référence souvent ce genre de chose donc cultivables à l'aide de listes n'est pas nécessaire ici.

21voto

Brian Rasmussen Points 68853

Une façon d'examiner cela est de regarder le code dans WinDbg. Alors vu le code ci-dessous, nous allons voir comment cela apparaît sur le tas.

var numbers = new Int32[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

La première chose à faire est de localiser l'instance. Comme je l'ai fait ce local en Main(), il est facile de trouver l'adresse de l'instance.

À partir de l'adresse on peut vider l'instance réelle, ce qui nous donne:

0:000> !do 0x0141ffc0
Name: System.Int32[]
MethodTable: 01309584
EEClass: 01309510
Size: 52(0x34) bytes
Array: Rank 1, Number of elements 10, Type Int32
Element Type: System.Int32
Fields:
None

Cela nous dit qu'il est de notre Int32 tableau avec 10 éléments et une taille totale de 52 octets.

Nous allons faire un dump de la mémoire où l'instance est situé.

0:000> d 0x0141ffc0
0141ffc0 [84 95 30 01 0a 00 00 00-00 00 00 00 01 00 00 00  ..0.............
0141ffd0  02 00 00 00 03 00 00 00-04 00 00 00 05 00 00 00  ................
0141ffe0  06 00 00 00 07 00 00 00-08 00 00 00 09 00 00 00  ................
0141fff0  00 00 00 00]a0 20 40 03-00 00 00 00 00 00 00 00  ..... @.........
01420000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01420010  10 6d 99 00 00 00 00 00-00 00 01 40 50 f7 3d 03  .m.........@P.=.
01420020  03 00 00 00 08 00 00 00-00 01 00 00 00 00 00 00  ................
01420030  1c 24 40 03 00 00 00 00-00 00 00 00 00 00 00 00  .$@.............

J'ai inséré des crochets pour les 52 octets.

  • Les quatre premiers octets sont la référence à la méthode de la table à 01309510.
  • Puis quatre octets pour la Longueur du tableau.
  • Suivant que sont les nombres de 0 à 9 (quatre octets).
  • Les quatre derniers octets sont nulles. Je ne suis pas entièrement sûr, mais je suppose que ça doit être là où la référence à la syncblock tableau est stocké si l'instance est utilisé pour le verrouillage.

Edit: Oublié de longueur dans le premier affichage.

L'inscription est légèrement incorrect parce que romkyns points de l'instance commence réellement à l'adresse - 4 et le premier champ est le Syncblock.

8voto

Eric Minkes Points 1051

Excellente question! Je voulais voir par moi-même, et il semblait une bonne occasion d'essayer CorDbg.exe...

Il semble que pour de simples entier tableaux, le format est le suivant:

ssssllll000011112222....nnnn0000

où s est la synchronisation de bloc, l la longueur du tableau, puis les éléments individuels. Il semble qu'il y est enfin un 0 à la fin, je ne suis pas sûr pourquoi.

Pour les tableaux multidimensionnels:

ssssttttl1l1l2l2????????
    000011112222....nnnn000011112222....nnnn....000011112222....nnnn0000

où s est la synchronisation de bloc, t le nombre total d'éléments, la longueur l1 de la première dimension, la longueur l2 de la deuxième dimension, puis deux zéros?, suivie par tous les éléments de manière séquentielle, et enfin un zéro de nouveau.

Tableaux d'objets, sont traités comme un tableau d'entiers, les contenus sont les références de ce temps. Les tableaux irréguliers sont des tableaux d'objets, où les références à d'autres tableaux.

7voto

ng5000 Points 4556

Grande question. J'ai trouvé cet article qui contient les diagrammes pour les deux types de valeur et les types référence. Voir aussi cet article dans lequel Ritcher états:

[snip] chaque tableau a d'autres la surcharge de l'information associée à c'. Cette information contient le rang de la matrice (nombre de dimensions), les limites inférieures pour chaque dimension de le tableau (presque toujours 0), et le la longueur de chaque dimension. Les frais généraux contient également le type de chaque élément dans le tableau.

0voto

AnthonyWJones Points 122520

Un objet tableau devrait stocker le nombre de dimensions dont il dispose et la longueur de chaque dimension. Il y a donc au moins un élément de données supplémentaire à ajouter à votre modèle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X