首页 > 后端开发 > Golang > 正文

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

DDD
发布: 2024-10-31 21:25:29
原创
383 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!