7
votes

Comment un tableau est-il stocké en mémoire?

Dans un intérêt pour approfondir de la manière dont la mémoire est allouée et stockée, j'ai écrit une application pouvant numériser l'espace d'adresses de mémoire, trouver une valeur et écrire une nouvelle valeur.

J'ai développé une application d'échantillon avec le L'objectif final est capable de localiser de manière programmée mon tableau et de l'écraser avec une nouvelle séquence de chiffres. Dans cette situation, j'ai créé un tableau unipimensionnel, avec 5 éléments, par exemple p> xxx pré>

J'ai exécuté mon application et recherché une séquence des cinq numéros ci-dessus. Je cherchais n'importe quelle valeur tombée entre 4 et 8, pour un total de 5 numéros de suite. Malheureusement, mes numéros séquentiels dans la matrice correspondaient à des centaines de résultats, car les chiffres 4 à 8, dans aucune séquence particulière se sont opposés à l'autre, en mémoire, dans de nombreuses situations. P>

y a-t-il de moyen Pour distinguer qu'un ensemble de nombres dans la mémoire représente une matrice, pas simplement des entiers qui sont côte à côte? Existe-t-il un moyen de savoir que si je trouve une certaine valeur, que les valeurs correspondantes en cours sont celles d'un tableau? P>

Je suppose que lorsque je déclare int [] int [code >, sa pointe à la première adresse de mon tableau, qui fournirait une sorte de métadonnées à ce qui existait dans la matrice, par exemple P>

0x123456789 meta-data, 5 - 32 bit integers 
0x123456789 + 32 "8"
0x123456789 + 64 "7"
0x123456789 + 96 "6"
0x123456789 + 128 "5"
0x123456789 + 160 "4"


1 commentaires

Hein? int [] array = nouveau tableau {8,7,6,5,4}; ?


5 Réponses :


0
votes

pas. Le tableau est stocké sur le tas et soumis à la réapparition due à la collecte des ordures. Vous devez utiliser fixe si vous Besoin de s'assurer que la mémoire n'est pas déplacée dans laquelle pouvez-vous utiliser mais seulement très soigneusement.

Si vous êtes après des tableaux haute performance, utilisez Stackalloc et utilisez votre schéma de code.


1 commentaires

Je ne vais rien faire ici, outre la connaissance de la manière dont l'échantillon ci-dessus serait stocké lorsqu'il est déclaré. Quoi qu'il arrive à ce que le tableau pendant la GC est au-delà de la portée de ce que je demande. Juste à la recherche d'éducation. :)



-1
votes

La mémoire n'est pas toujours stockée contiguë. Si vous pouvez vous assurer que c'est possible, ce que vous demandez est possible.


1 commentaires

Les tableaux sont stockés contiguës dans la mémoire virtuelle. La mémoire virtuelle contiguë ne signifie pas une mémoire physique contiguë, mais je serais très surpris si cette "application de scanner" utilise des adresses physiques. Vous devrez seulement vous soucier des détails comme celui-ci si vous utilisez un moteur DMA matériel pour numériser la mémoire.



0
votes

Je ne sais pas exactement mais Cet article semble Suggérer que vous pouvez obtenir un pointeur à votre tableau, avec lequel je penserais que vous pouvez déterminer l'adresse réelle.


0 commentaires

0
votes

Bien que je vois que vous utilisez C # et, probablement, .NET, la plupart de votre question est en termes très généraux sur la mémoire. Gardez l'esprit que, dans le sens le plus général, toute la mémoire est juste des bits si cette mémoire contient une matrice, des chaînes ou un code.

Avec cela à l'esprit, à moins que vous ne puissiez trouver de signes Tell-Tale de votre plate-forme actuelle d'attribuer différents types de données, il n'y a aucune différence entre la mémoire contenant des tableaux, des chaînes ou du code.

En outre, je ne ferais aucune hypothèse sur si un tableau "Points" au premier élément de la matrice. Peut-être que quelqu'un d'autre peut résoudre ce problème spécifiquement, mais j'assurerais une sorte d'en-tête est impliqué.


2 commentaires

D'accord. J'ai supprimé la balise C #.


Dans ce cas, je dirais que la réponse à votre question est non.



8
votes

Debug + Windows + Memory + Memory 1, Définissez le champ Adresse sur "Array". Vous verrez cela lorsque vous allumez la vue sur "INTEGER 4 octet":

0x018416BC  6feb2c84 00000005 00000008 00000007 00000006 00000005 00000004


3 commentaires

Si le 3ème ensemble de chiffres représente la longueur de la matrice et que les numéros de suivi après avoir assorti la plage cible de nombres et de longueur connus - je peux voir qu'elles deviennent assez proches. Par exemple, si je devais rechercher 000000FF 000000FF, connaissant que j'avais une matrice de longueur de 255 en longueur, puis testé la procédure de 255 numéros pour une fourchette que je savais était dans la matrice, telle que 0-5, les chances de trouver cette combinaison exacte Ailleurs dans le code semble être aussi mince. Les chances de correspondre cependant auraient moins probablement plus probablement la matrice que j'ai déclarée.


Hé bien oui. Les adresses sont un multiple de 4. L'ambiguïté est le problème, vous n'avez rien à choisir le «bon». Et jusqu'à 2 milliards d'octets à la recherche. VirtualQuery peut couper cela, envisagez uniquement des pages de lecture +.


Modifiait mon application avec le 3ème numéro de numéro que vous avez mentionné et quelques autres règles de recherche abstraite définies pour être énumérées rapidement et à la volée grâce à l'espace d'adresses de processus. Trouvé mon tableau, et seulement mon tableau, en une fraction de seconde. Très appréciée!