Maison > développement back-end > C++ > Comment les tableaux et les types de valeur sont-ils alloués sur la pile et le tas en C# ?

Comment les tableaux et les types de valeur sont-ils alloués sur la pile et le tas en C# ?

Linda Hamilton
Libérer: 2024-12-29 09:18:11
original
374 Les gens l'ont consulté

How are arrays and value types allocated on the stack and heap in C#?

Allocation de tableau et types de valeurs sur la pile par rapport au tas

Dans votre extrait de code :

int[] myIntegers;
myIntegers = new int[100];
Copier après la connexion

lorsque vous créez le tableau myIntegers en utilisant le mot-clé new, le tableau lui-même est alloué sur le tas, comme suggéré par le CLR. Cependant, les éléments entiers du tableau, étant des types valeur, ne sont pas encadrés.

Pile et variables locales

Toutes les variables locales d'une fonction, y compris les types valeur et Les types de référence sont alloués sur la pile. La différence entre les deux réside dans ce qui est stocké dans ces variables.

  • Les types de valeur stockent la valeur réelle directement dans la variable.
  • Les types de référence stockent une référence à la valeur sur le tas, et la variable elle-même contient l'adresse de cette référence.

Exemple pour RefTypes et ValTypes

Considérez les types suivants :

class RefType {
    public int I;
    public string S;
    public long L;
}

struct ValType {
    public int I;
    public string S;
    public long L;
}
Copier après la connexion

La valeur de chaque type nécessite 16 octets de mémoire : 4 octets pour I, 4 octets pour la référence S (ou la référence réelle chaîne S pour ValType), et 8 octets pour L.

Si vous avez des variables locales de type RefType, ValType et int[], ils seraient alloués sur la pile comme suit :

Stack:

0-3 bytes: RefType variable
4-7 bytes: ValType variable
8-11 bytes: int[] variable
Copier après la connexion

Disposition de la mémoire

Lors de l'attribution de valeurs à ces variables :

refType = new RefType();
refType.I = 100;
refType.S = "refType.S";
refType.L = 0x0123456789ABCDEF;

valType = new ValType();
valType.I = 200;
valType.S = "valType.S";
valType.L = 0x0011223344556677;

intArray = new int[4];
intArray[0] = 300;
intArray[1] = 301;
intArray[2] = 302;
intArray[3] = 303;
Copier après la connexion

les valeurs seront réparties dans la suite manière :

Stack:

0-3 bytes: Heap address of `refType`
4-7 bytes: Value of `valType.I`
8-11 bytes: Heap address of `valType.S`
12-15 bytes: Low 32-bits of `valType.L`
16-19 bytes: High 32-bits of `valType.L`
20-23 bytes: Heap address of `intArray`
Copier après la connexion

Tas :

  • À l'adresse du tas de refType :

    • 0-3 octets : valeur de refType.I
    • 4-7 octets : adresse de tas de refType.S
    • 8-11 octets : 32 bits faibles de refType.L
    • 12-15 octets : 32 bits élevés de refType.L
  • Au tas d'intArray adresse :

    • 0-3 octets : Longueur du tableau (4)
    • 4-7 octets : Valeur de intArray[0] (300)
    • 8 -11 octets : valeur de intArray[1] (301)
    • 12-15 octets : valeur de intArray[2] (302)
    • 16-19 octets : valeur de intArray[3] (303)
**Passing Arrays**
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal