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
Lepaskan: 2024-12-29 09:18:11
asal
352 orang telah melayarinya

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];
Salin selepas log masuk

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;
}
Salin selepas log masuk

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
Salin selepas log masuk

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;
Salin selepas log masuk

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`
Salin selepas log masuk

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**
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan