首頁  >  文章  >  後端開發  >  Go 閉包實際消耗了多少記憶體?

Go 閉包實際消耗了多少記憶體?

DDD
DDD原創
2024-10-31 21:25:29451瀏覽

How Much Memory Do Go Closures Actually Consume?

Go 閉包的記憶體佈局

與利用不同閉包實現的JavaScript 相比,Go 閉包儲存在堆上,因為

閉包的記憶體分配

考慮以下產生閉包的函數:

<code class="go">type M int

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

當呼叫a := m 時.Adder( ),發生兩次堆分配:

  • 16位元組:儲存函數指標和指向擷取變數(m)的指標。
  • 變數大小:取決於捕獲變數的類型和大小。在本例中,它是一個 int,因此需要 4 個位元組。

傳回的func() 值的記憶體佔用

傳回的func() 值消耗:

  • 32 位元平台上為8 個位元組,64 位元平台上為16 個位元組: 儲存函數指標。

因此,總共本範例中閉包的記憶體佔用量在 32 位元平台上為 20 位元組,在 64 位元平台上為 32 位元組

範例:

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

呼叫closure()分配:

  • 16位元組:閉包元資料(函數指針,捕獲的變數指針)
  • 4096位元組: 閉包捕獲的位元組數組

導致總記憶體分配 4112 位元組.

以上是Go 閉包實際消耗了多少記憶體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn