Go中切片内存占用问题,相差了两倍???

lysShub · 2021-01-23 23:22:23 · 1229 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-01-23 23:22:23 的主题,其中的信息可能已经有所发展或是发生改变。

func main() {
    debug.SetGCPercent(-1)

    fh, _ := os.Open(`E:\android-ndk-r15c-windows-x86_64.zip`)
    fi, _ := fh.Stat()
    l := int(fi.Size())

    for i := 0; i < l; {
        b := make([]byte, 1024)
        fh.ReadAt(b, int64(i))
        X(&b)
        i = i + 1024
    }
}

func X(b *[]byte) {

    h := []byte("12345678")
    // --------------方-案-一-------------------- //
    fmt.Println(&((*b)[len(*b)-1]))
    *b = append(h, (*b)...) // 900MB
    fmt.Println(&((*b)[len(*b)-1]))
    // --------------方-案-二-------------------- //
    // fmt.Println(&((*b)[1023]))
    // *b = append((*b), h...) // 1900MB
    // fmt.Println(&((*b)[1023]))
}

为什么方案二占用内存比方案一两倍还多?
值得一提的是方案二的b在append之前和之后的地址都没变!


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1229 次点击  
加入收藏 微博
2 回复  |  直到 2021-01-26 10:42:38
lysShub
lysShub · #1 · 4年之前

顶一顶

tdbqs
tdbqs · #2 · 4年之前

cap 与 len

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传