Rumah > pembangunan bahagian belakang > C++ > Timbunan atau Tindanan: Di manakah `baru` Memperuntukkan Memori untuk Struktur C#?

Timbunan atau Tindanan: Di manakah `baru` Memperuntukkan Memori untuk Struktur C#?

DDD
Lepaskan: 2025-01-13 15:16:41
asal
684 orang telah melayarinya

Heap or Stack: Where Does `new` Allocate Memory for a C# Struct?

Apabila menggunakan kata kunci "baharu" untuk mencipta struktur dalam C#, adakah memori diperuntukkan pada timbunan atau timbunan?

Apabila mencipta contoh kelas menggunakan pengendali "baharu", memori diperuntukkan pada timbunan. Tetapi apabila menggunakan pengendali "baru" untuk mencipta contoh struktur, di manakah memori diperuntukkan?

Timbunan ingatan dan timbunan ingatan

Timbunan ialah struktur data yang digunakan untuk menyimpan pembolehubah tempatan dan panggilan kaedah semasa pelaksanaan program. Ia ialah struktur masuk-dahulu-keluar (LIFO), yang bermaksud bahawa memori yang paling baru diperuntukkan dialih keluar dahulu.

Timbunan ialah ruang memori dinamik di mana objek dicipta dan diperuntukkan mengikut keperluan. Tidak seperti timbunan, ia tidak mengikut susunan tertentu peruntukan memori.

Gunakan kata kunci "baharu" untuk mencipta peruntukan memori untuk struktur

Untuk struktur, apabila menggunakan pengendali "baharu", anda perlu mempertimbangkan dua situasi:

  1. Pembina tanpa parameter (Guid(); baharu):

    • Menggunakan operator "baharu" dan pembina tanpa parameter memperuntukkan memori untuk struktur pada timbunan.
    • Ini kerana pengkompil C# menganggap pembina tanpa parameter sebagai kes khas, menganggapnya sebagai operasi permulaan sifar.
    • Oleh itu, lokasi memori baharu dicipta pada timbunan dan struktur dibina di dalamnya.
  2. Pembina dengan parameter (Panduan baharu(someString);):

    • Menggunakan operator "baharu" dan pembina berparameter memperuntukkan memori pada tindanan untuk storan sementara.
    • Selepas pembina memulakan struktur, memori tindanan yang diperuntukkan akan dibuang.
    • Proses ini berbeza daripada memberikan struktur instantiated kepada pembolehubah tempatan, yang memperuntukkan memori pada timbunan, sama seperti pembina tanpa parameter.

Penjanaan kod IL

Untuk memahami perkara yang berlaku di sebalik tabir, mari kita periksa kod bahasa perantaraan (IL) yang dijana oleh pengkompil C#:

    Arahan
  • newobj memperuntukkan ruang pada tindanan dan memanggil pembina berparameter untuk nilai perantaraan (cth., parameter kaedah).
  • Arahan
  • call instance memulakan lokasi storan yang diperuntukkan (tindanan atau timbunan) menggunakan pembina berparameter.
  • Arahan
  • initobj memulakan lokasi storan yang diperuntukkan (tindanan atau timbunan), mengosongkan kandungannya kepada sifar (untuk panggilan pembina tanpa parameter).

Kesimpulan

Ringkasnya, tidak seperti contoh kelas yang sentiasa memperuntukkan memori pada timbunan, menggunakan operator "baharu" pada struct akan memperuntukkan memori pada timbunan dalam kes pembina tanpa parameter dan dalam kes pembina berparameter pada timbunan (untuk simpanan sementara). Tingkah laku ini dicerminkan dalam kod IL yang dijana dan memberikan pandangan tentang proses pengurusan memori yang mendasari.

Atas ialah kandungan terperinci Timbunan atau Tindanan: Di manakah `baru` Memperuntukkan Memori untuk Struktur 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan