Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Berapa Banyak Memori yang Sebenarnya Digunakan oleh Penutupan?

Berapa Banyak Memori yang Sebenarnya Digunakan oleh Penutupan?

DDD
DDDasal
2024-10-31 21:25:29366semak imbas

How Much Memory Do Go Closures Actually Consume?

Dalam Reka Letak Memori Penutupan Go

Berbeza dengan JavaScript, yang memanfaatkan pelaksanaan penutupan yang berbeza, penutupan Go disimpan pada timbunan yang sepatutnya kepada jangka hayat yang berubah-ubah.

Peruntukan Memori untuk Penutupan

Pertimbangkan fungsi berikut yang menghasilkan penutupan:

<code class="go">type M int

func (m *M) Adder(amount int) func() {
    return func() {
        *m = *m + amount
    }
}</code>

Apabila memanggil := m .Adder(), dua peruntukan timbunan berlaku:

  • 16 bait: Menyimpan penuding fungsi dan penuding kepada pembolehubah yang ditangkap (m).
  • Saiz pembolehubah: Bergantung pada jenis dan saiz pembolehubah yang ditangkap. Dalam kes ini, ia adalah int, jadi ia mengambil masa 4 bait.

Jejak Memori Nilai func() yang Dipulangkan

Nilai func() yang dikembalikan menggunakan :

  • 8 bait pada platform 32-bit, 16 bait pada platform 64-bit: Menyimpan penunjuk fungsi.

Oleh itu, jumlah jejak memori penutupan dalam contoh ini ialah 20 bait pada platform 32-bit, 32 bait pada platform 64-bit.

Contoh:

<code class="go">func closure() func() *byte {
    var b [4 * 1024]byte
    return func() *byte {
        return &amp;b[0]
    }
}</code>

Penutupan panggilan() memperuntukkan:

  • 16 bait: Metadata penutupan (penunjuk fungsi, penuding pemboleh ubah ditangkap)
  • 4096 bait: Tatasusunan bait yang ditangkap oleh penutupan

Menghasilkan jumlah peruntukan memori sebanyak 4112 bait.

Atas ialah kandungan terperinci Berapa Banyak Memori yang Sebenarnya Digunakan oleh Penutupan?. 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