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
Linda Hamiltonoriginal
2024-12-29 09:18:11379parcourir

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];

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;
}

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

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;

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`

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**

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!

Déclaration:
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