Go 中,除了使用缓存池,如何减少 slice 的动态分配?

发布于 2022-09-04 00:32:55 字数 297 浏览 22 评论 0

比如,有这样一个函数:

func foo(n int) []byte {
    bar := make([]byte, n)
    ...do some thing with b
    return bar
}

bar := make([]byte, n)是一处动态内存分配,函数的其他部分不会再对bar的大小进行修改了。这种情况下有没有方法消除bar := make([]byte, n)这处动态内存分配?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

驱逐舰岛风号 2022-09-11 00:32:55

这个问题只能从你自身的需求来讲,每次调用foo如果期望一个独立的slice返回,那么只能这么办了。如果不是这样,可以考虑以下方法:

  • 申明一个生命周期在函数foo以外的slice,每次复用这个slice(前提是你需要保证这样没问题)

func bar(length int) func(int) []byte {
    s := make([]byte, length)
    return func(n int) []byte {
        //do something with s
        return s
    }
}
  • 类似于redis的内存管理,初始化一个大slice,每次使用大slice的一部分

var gs = make([]byte, verylong)
var lastPosition int
func foo(n int) []byte {
    last := lastPosition
    s := gs[last:last+n]
    //do something with s
    updateLastPosition()
    //如果要保证thread safe需要自己做额外的工作
    //需要处理last+n > verylong的情况
    return s
}
伤感在游骋 2022-09-11 00:32:55

可以bar := make([]byte, n, capacity),预先指定一个容量。

摘星┃星的人 2022-09-11 00:32:55

这种问题是很单纯的自己想多的。

如果是Read Only 的可以使用楼上的方法。

如果不是,那么别想多了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文