Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah tatasusunan dan jenis nilai diperuntukkan pada timbunan dan timbunan dalam C#?

Bagaimanakah tatasusunan dan jenis nilai diperuntukkan pada timbunan dan timbunan dalam C#?

Linda Hamilton
Linda Hamiltonasal
2024-12-29 09:18:11374semak imbas

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

Peruntukan Tatasusunan dan Jenis Nilai pada Tindanan lwn. Timbunan

Dalam coretan kod anda:

int[] myIntegers;
myIntegers = new int[100];

apabila anda buat tatasusunan myIntegers menggunakan kata kunci baharu, tatasusunan itu sendiri diperuntukkan pada timbunan, seperti yang dicadangkan oleh CLR. Walau bagaimanapun, elemen integer dalam tatasusunan, sebagai jenis nilai, tidak berkotak.

Pembolehubah Tindanan dan Setempat

Semua pembolehubah tempatan dalam fungsi, termasuk jenis nilai dan jenis rujukan, diperuntukkan pada timbunan. Perbezaan antara kedua-duanya terletak pada apa yang disimpan dalam pembolehubah ini.

  • Jenis nilai menyimpan nilai sebenar secara langsung dalam pembolehubah.
  • Jenis rujukan menyimpan rujukan kepada nilai pada heap, dan pembolehubah itu sendiri mengandungi alamat rujukan ini.

Contoh untuk RefTypes dan ValTypes

Pertimbangkan jenis berikut:

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

struct ValType {
    public int I;
    public string S;
    public long L;
}

Nilai setiap jenis memerlukan 16 bait memori: 4 bait untuk I, 4 bait untuk rujukan S (atau yang sebenar Rentetan S untuk ValType), dan 8 bait untuk L.

Jika anda mempunyai pembolehubah tempatan jenis RefType, ValType, dan int[], ia akan diperuntukkan pada tindanan seperti berikut:

Stack:

0-3 bytes: RefType variable
4-7 bytes: ValType variable
8-11 bytes: int[] variable

Reka Letak Memori

Apabila memberikan nilai kepada pembolehubah ini:

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;

nilai akan diedarkan dalam perkara berikut cara:

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`

Timbunan:

  • Di alamat timbunan refType:

    • 0-3 bait: Nilai refType.I
    • 4-7 bait: Alamat timbunan refType.S
    • 8-11 bait: Rendah 32-bit refType.L
    • 12-15 bait: Tinggi 32-bit refType.L
  • Di timbunan intArray alamat:

    • 0-3 bait: Panjang tatasusunan (4)
    • 4-7 bait: Nilai intArray[0] (300)
    • 8 -11 bait: Nilai intArray[1] (301)
    • 12-15 bait: Nilai intArray[2] (302)
    • 16-19 bait: Nilai intArray[3] (303)
**Passing Arrays**

Atas ialah kandungan terperinci Bagaimanakah tatasusunan dan jenis nilai diperuntukkan pada timbunan dan timbunan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn