J'ai juste fait un calcul approximatif autour de la taille maximale d'un entier non signé de 64 bits , qui est :
18,446,744,073,709,551,615
q5 q4 t b m t h
Regarder Spécifications matérielles d'AWS sur leurs plus grosses machines, il atteint jusqu'à 3,904GB
, qui est :
3,904,000,000,000,000,000 bytes
5 q4 t b m t h
Pour moi, cela signifie que la les pointeurs sont stockés sous forme d'entiers de 64 bits . Je suis novice en matière de mémoire et de pointeurs, mais je voulais juste clarifier ce point.
Je suis encore un peu confus. A pointeur est une "construction de langage de programmation". Donc, techniquement, même sur une machine 64 bits, si vous n'utilisez que moins de ~4 milliards (taille maximale d'un entier de 32 bits), je me demande pourquoi il n'est pas possible de se contenter de pointeurs de 32 bits. De cette façon, les pointeurs sont de 32 bits jusqu'à ce que vous manquiez d'espace, puis vous pouvez commencer à utiliser des pointeurs de 64 bits. On aurait alors un peu plus d'espace pour avoir plus d'objets.
Mais je ne sais toujours pas ce qu'il en est. Un pointeur contient l'emplacement d'un adresse en mémoire . Il est indiqué que l'"adresse" est de 64 bits. Donc, si nous avions des pointeurs de 32 bits pointant sur des morceaux de 32 bits dans la mémoire de 64 bits, je ne suis pas sûr de savoir à quoi cela ressemblerait ou ce que cela signifierait. Il semble que cela signifie qu'il faudrait faire décalages (bien que je ne comprenne pas très bien).
Je me demandais si l'on pouvait démontrer en C, en Assembleur ou en JavaScript, comment il serait possible de stocker des pointeurs de 32 bits dans un espace d'adressage de 64 bits. Si le C le gère automatiquement, alors comment l'Assembleur le fait.
J'aimerais savoir comment je pourrais utiliser une grande mémoire comme ci-dessus, mais stocker des pointeurs 32 bits, jusqu'à ce que le maximum soit atteint, puis utiliser des pointeurs 64 bits, et je ne suis pas sûr de ce à quoi cela ressemblerait exactement. Je vais essayer de dessiner un diagramme expliquant comment j'envisage la chose.
| The bars and . are like a ruler and mark the bit positions.
- Each row under a number (1, 2, 3, ...) means a memory address.
Means no data in memory address.
Means data of type 1 in memory address.
Means data of type 2 in memory address.
Means a bit of integer pointer is plugged into memory address slot.
Means no bit of integer pointer is plugged into memory address slot.
|
| |
| | | |
| | | | | | | |
| | | | | | | | | | | | | | | |
. | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
1. Empty 64-bit memory.
...
...
...
...
2. 64-bit memory filled with 32-bit pieces of data (type 1 , type 2 ).
...
...
...
...
3. 64-bit memory filled with 64-bit pieces of data.
...
...
...
...
4. 64-bit memory filled with 4-bit pieces of data.
...
...
...
...
5. 64-bit memory filled with 32-bit pieces of data, with second 32-bits accessed by a 32-bit pointer.
...
...
...
...
6. 64-bit memory filled with 64-bit pieces of data, with second 64-bits accessed by a 64-bit pointer.
...
...
...
...
7. 64-bit memory filled with 4-bit pieces of data, with second piece of data accessed by a pointer.
...
...
...
...
8. 64-bit memory filled with 8-bit pieces of data, with second piece of data accessed by a pointer.
...
...
...
...
Ce que j'imagine, c'est que les nombres entiers sont comme les clés d'un verrou (qui est l'adresse de la mémoire). Un trou de serrure vide ressemble aux 64 's alignés dans (1). Un trou de serrure complet pour une adresse de 64 bits ressemble aux 64 's en ligne dans (6). Si je donne à l'espace d'adressage de la mémoire de 64 bits un 32 bits c'est comme si cela ressemblait à (5). Il ne remplirait donc pas entièrement le trou de clé de 64 bits, il n'en remplirait (dans ce cas) que la seconde moitié. Il semble donc que cela ne correspondrait pas à l'adresse. Mais j'essaie d'indiquer les 32 bits de données qui se trouvent dans la seconde moitié ! Pour que l'adresse corresponde, il semble qu'il faille combler les trous de la rangée complète de 64 bits, comme dans (6). Je me demande si je n'ai pas mal compris, merci de m'indiquer où je me trompe.
Au cas où cela n'aurait pas été clair, les premiers chiffres 1 à 4 du tableau indiquent les données qui se trouvent dans la mémoire (1 étant une mémoire vide). Les deuxièmes nombres 5 à 8 montrent que nous essayons de accès les données à l'aide d'un pointeur (les cercles noirs dans une rangée étant le pointeur/la clé du verrouillage de l'adresse mémoire).
Enfin, j'ai une dernière question à poser. Je me demande s'il est possible d'aller plus loin et de stocker des données encore plus petites. Par exemple, stocker 4 bits de données, comme dans (7). Cela démontre simplement comment le système de pointeurs et d'adresses fonctionne de manière un peu plus détaillée. Je ne sais pas s'il est possible d'avoir un Pointeur 4 bits pointent vers un morceau de mémoire de 4 bits. En raison des exigences en matière d'alignement, il semble que l'on doive récupérer au moins 8 bits à la fois. Mais ce n'est pas grave. Je veux juste m'assurer qu'il est possible ou non d'utiliser un pointeur de n bits pour accéder à n bits de données dans un espace mémoire de 64 bits.
Et si c'est le cas, comment cela se présenterait, soit en C, soit en Assemblage, soit en JavaScript.
J'aimerais savoir comment on est censé stocker des données dans une mémoire de 64 bits, et ce qu'on est autorisé à faire avec les pointeurs étant donné que "les adresses de la mémoire sont de 64 bits". Autrement dit, si je peux faire memory.get(a32BitPointer)
et qu'il renvoie 32 bits de données, à partir d'un emplacement de mémoire aligné sur 32 bits. (Ou, de manière équivalente, un élément de données ou un pointeur de taille de 4, 8, 16, etc. bits).