Allocation de tas et de pile : décomposition des tableaux et des types de valeurs
Dans l'extrait de code présenté :
int[] myIntegers; myIntegers = new int[100];
le tableau myIntegers est généré sur le tas. Contrairement à la croyance populaire, les valeurs entières réelles stockées dans le tableau ne sont pas encadrées.
Clarifier l'allocation de la pile et du tas
L'idée fausse courante selon laquelle les types de valeurs sont alloués sur le Les types de pile et de référence sur le tas ne sont pas entièrement précis. Toutes les variables et paramètres locaux, quel que soit leur type, sont alloués sur la pile. La distinction clé réside dans ce qui est stocké dans ces variables :
Allocation de mémoire pour les types valeur et référence
Les types valeur et référence occupent une quantité spécifique de mémoire, généralement 16 octets pour les exemples de types fournis. . Dans cette mémoire :
Exemple : Stack et Heap Allocation
Considérez les variables locales suivantes :
RefType refType; ValType valType; int[] intArray;
Initialement, seules leurs références résident sur la pile, occupant 20 octets :
0 ┌───────────────────┐ │ refType │ 4 ├───────────────────┤ │ valType │ │ │ │ │ │ │ 20 ├───────────────────┤ │ intArray │ 24 └───────────────────┘
Lors de l'attribution valeurs à ces variables :
// Assign values to refType // ... // Assign values to valType // ... intArray = new int[4]; intArray[0] = 300; // ... intArray[3] = 303;
La représentation de la pile serait ressembler :
0 ┌───────────────────┐ │ 0x4A963B68 │ -- heap address of `refType` 4 ├───────────────────┤ │ 200 │ -- value of `valType.I` │ 0x4A984C10 │ -- heap address of `valType.S` │ 0x44556677 │ -- low 32-bits of `valType.L` │ 0x00112233 │ -- high 32-bits of `valType.L` 20 ├───────────────────┤ │ 0x4AA4C288 │ -- heap address of `intArray` 24 └───────────────────┘
Le tableau ainsi que les types valeur et référence occupent des sections spécifiques du tas, avec des dispositions de mémoire comme décrit précédemment.
En résumé, le tableau myIntegers est alloué sur le tas, tandis que les valeurs entières individuelles qui y sont stockées ne sont pas encadrées. Ils sont simplement stockés directement dans la mémoire allouée sur le tas, sans qu'il soit nécessaire de les envelopper dans des objets supplémentaires.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!