Berapa Banyak Memori yang Sebenarnya Digunakan oleh Penutupan?

DDD
Lepaskan: 2024-10-31 21:25:29
asal
452 orang telah melayarinya

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

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

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!

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