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.
4 Réponses :
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. P> blockQuote>
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) p>
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? p> blockQuote>
Oui, sauf si vous avez un éventail de primitives bien sûr. p>
Qu'en est-il des types de données bruts? Cela fonctionnera-t-il différemment alors? P> blockQuote>
Les primitives et les références sont continues en mémoire. Ils sont fondamentalement les mêmes. P>
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)? P> blockQuote>
oui. p>
en Java, n'y a-t-il aucun moyen pour le programmeur de garantir l'allocation de mémoire contiguë d'objets? p> blockQuote>
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 em>, les objets seront continus en mémoire. P>
Cela pourrait arriver par hasard, ou avec une probabilité élevée, mais le programmeur ne peut pas garantir que ce sera le cas? P> blockQuote>
correct. Habituellement, vous avez de plus gros problèmes lorsque vous regardez les pires latences de 0,1% ou plus. P>
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? P> blockQuote>
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. P>
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 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. P> gratuit () code> chaque pointeur que vous
malloc () code>. p>
à 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. P>
4) Dans Python, vous pouvez créer un tableau contigu, si vous utilisez Sciped P>
Je ne peux pas parler de détail à Java, même si ma compréhension est celle qui compte que le code suivant la variable locale (pile) pour un tableau de types primitifs, les valeurs sont stockées directement dans Les tableaux C et C ++ sont beaucoup moins compliqués. Compte tenu du code suivant: p> Vous obtenez ce qui suit: p> 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 pour tout type arr code> contient un Référence à un objet Array sur le tas, en nous donnant une mise en page quelque chose comme ceci: p>
Arr [ 0] code>,
arr [1] code>, 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). p>
arr code> pour pointer sur le premier élément de la matrice. Si la matrice a
Auto CODE> étendue (ce qui signifie qu'il a été déclaré sous un bloc et non
statique code>), la mémoire pour les éléments de tableau est également attribuée à toute variable locale. p>
t code>,
t arr [n] code> sera mis de côté
n code> éléments contigus pour stocker des valeurs de type < code> t code>. Si
t code> est un type ernoxieux
struct code>, puis
t a [n] code> stocke
n code> des instances contiguës de cet odieux < code> struct code> type. p> p>
Qu'en est-il d'un tableau d'E.G. Donnez des entiers i>? 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 i> voulez-vous dire
int code> ou
integer code>? 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 [] code> vs
int [] code>). 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 b> votre idée de Miss et c'est ce que j'ai essayé d'indiquer! Le contenu de la matrice C est TOUJOURS B> Qu'est-ce que vous spécifiez: un pointeur (quoi que ce soit), un
int code>, un
struct code>.