首页  >  文章  >  后端开发  >  Go 闭包实际消耗了多少内存?

Go 闭包实际消耗了多少内存?

DDD
DDD原创
2024-10-31 21:25:29366浏览

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