7
votes

Tableaux dans différentes langues - Références de magasin, ou objets bruts?

J'essaie d'envelopper ma tête autour de ce que la mémoire brute ressemble à différentes langues lors de l'utilisation d'un tableau.

Considérez le code Java suivant: P>

struct my_struct array[5];  // allocates 5 * size(my_struct) in memory! NOT room for 5
                            // references/pointers, but room for 5 my_structs.


5 commentaires

Qu'en est-il d'un tableau d'E.G. Donnez des entiers ? Pensez-vous que cela serait stocké comme cinq références à Java? En outre, la simple réponse à cette question est que vous ne pouvez pas simplement comparer des langues comme celle-ci, différentes langues font différentes choses et ont une sémantique différente, même pour des choses qui semblent identiques.


C n'a pas de références. Vous comparez des pommes avec des oranges.


Par entier voulez-vous dire int ou integer ? Le premier est un scalaire, ce dernier est un wrapper d'objet qui serait, en fait, être stocké en tant que références aux objets sur le tas. (par exemple, entier [] vs int [] ). En python, même des entiers sont des références aux objets.


@Oolaf, les pointeurs en C sont fondamentalement des références en Java, il est donc à peine des pommes à des oranges. Ils peuvent fonctionner de différentes manières et exposer différentes quantités de contrôle à l'utilisateur, mais un tableau en Java (de types non primitifs) est essentiellement équivalent à une gamme de pointeurs en C, aucune pomme ou oranges invovit. C'est-à-dire qu'ils stockent tous les deux véritablement les pointeurs vers d'autres emplacements de mémoire où résident les objets référencés.


Non ils ne sont pas. Une référence n'a pas de valeur propre, c'est toujours l'objet qu'il pointe, un pointeur fait (objet de première classe). C'est exactement votre idée de Miss et c'est ce que j'ai essayé d'indiquer! Le contenu de la matrice C est TOUJOURS Qu'est-ce que vous spécifiez: un pointeur (quoi que ce soit), un int , un struct .


4 Réponses :


7
votes

Vous ne pouvez jamais imaginer des tableaux en tant que seaux d'objets contigus en mémoire, mais plutôt comme des références contiguës.

En théorie, vous avez raison, dans la pratique, la JVM ne fait pas aléatoir l'accès à la mémoire. Il attribue de la mémoire séquentiellement et il copie des objets lors d'un GC par ordre de découverte (ou d'ordre inverse)

Est-ce que j'ai raison dans mon hypothèse que, dans Java, les tableaux doivent toujours tenir des références, car le programmeur n'a jamais accès à des références à Java?

Oui, sauf si vous avez un éventail de primitives bien sûr.

Qu'en est-il des types de données bruts? Cela fonctionnera-t-il différemment alors?

Les primitives et les références sont continues en mémoire. Ils sont fondamentalement les mêmes.

Un tableau d'INTS dans Java ressemble tout simplement comme un en C dans la mémoire brute (en plus de la classe d'objet Cruft Java ajoutera)?

oui.

en Java, n'y a-t-il aucun moyen pour le programmeur de garantir l'allocation de mémoire contiguë d'objets?

Pas à moins que vous n'utilisiez la mémoire de tas de tas. Bien que cela ne soit généralement pas autant de problème que vous pourriez penser que la plupart du temps , les objets seront continus en mémoire.

Cela pourrait arriver par hasard, ou avec une probabilité élevée, mais le programmeur ne peut pas garantir que ce sera le cas?

correct. Habituellement, vous avez de plus gros problèmes lorsque vous regardez les pires latences de 0,1% ou plus.

en C, les programmeurs peuvent créer des matrices brutes d'objets (structures) contiguës en mémoire, comme je l'ai montré ci-dessus, correct?

oui. Vous pouvez également le faire dans Java, mais vous devez utiliser la mémoire de tas de tas. Il existe un certain nombre de bibliothèques qui soutiennent cela comme Javolution, Chronicle, SBE.


0 commentaires

0
votes

Langues de bas niveau telles que c Faites-vous gérer la mise en page de la mémoire et si vous avez un pointeur ailleurs ou une valeur ici. Assurez-vous de gérer correctement l'allocation de tas de pile vs tas correctement et n'oubliez pas de gratuit () chaque pointeur que vous malloc () .

Niveau supérieur Langues comme Java, Python et Javascript éloignent cette mise en page de mémoire de bas niveau. Tous les objets sont sur le tas et vous en avez une référence. Bien que la référence soit similaire à celle d'un pointeur, il est opaque et non associé directement à un emplacement de mémoire donné. En tant que telle, toutes les structures de données contiennent des références aux objets.


0 commentaires

0
votes

à 1) dans les matrices Java sont des objets et des objets et des matrices sont stockés sur le tas, car le tas peut ne pas être continu, des tableaux peuvent également ne pas être continu.

4) Dans Python, vous pouvez créer un tableau contigu, si vous utilisez Sciped


0 commentaires

0
votes

Je ne peux pas parler de détail à Java, même si ma compréhension est celle qui compte que le code suivant xxx

la variable locale (pile) arr contient un Référence à un objet Array sur le tas, en nous donnant une mise en page quelque chose comme ceci: xxx

pour un tableau de types primitifs, les valeurs sont stockées directement dans Arr [ 0] , arr [1] , etc. Pour un tableau de types de classe, chaque élément de la matrice stocke une référence à une instance de cette classe, il existe donc un autre niveau d'indirection. Les références elles-mêmes sont stockées contiguës, mais les instances qu'elles soulignent ne sont pas (ou du moins, ne sont pas garanties).

Les tableaux C et C ++ sont beaucoup moins compliqués. Compte tenu du code suivant: xxx

Vous obtenez ce qui suit: xxx

Il n'y a pas d'indirection ni de métadonnées impliquées dans un tableau C . Il n'y a pas de stockage réservé à un objet arr pour pointer sur le premier élément de la matrice. Si la matrice a Auto étendue (ce qui signifie qu'il a été déclaré sous un bloc et non statique ), la mémoire pour les éléments de tableau est également attribuée à toute variable locale.

pour tout type t , t arr [n] sera mis de côté n éléments contigus pour stocker des valeurs de type < code> t . Si t est un type ernoxieux struct , puis t a [n] stocke n des instances contiguës de cet odieux < code> struct type.


0 commentaires