gpt4 book ai didi

go - GC是否处理数组的未指向部分

转载 作者:数据小太阳 更新时间:2023-10-29 03:18:02 25 4
gpt4 key购买 nike

假设我们以这种方式创建了一个 slice :

arr := make([]byte, 0, 10)
arr = append(arr, []byte{1, 1, 1}...)

然后我们要释放 7 个尾字节:

arr = arr[:len(arr)]

我们让 slice 的尾部无法到达。 GC 会在下一次扫描迭代中简单地声明此内存是免费的吗?或者底层数组会发生其他事情(例如 copy(),内 stub 本不会被释放)?

最佳答案

Let's say that we created a slice this way:

arr := make([]byte, 0, 10)
arr = append(arr, []byte{1, 1, 1}...)

And then we want to free 7 tail bytes:

arr = arr[:len(arr)]

你不能; Go GC 不会进行部分释放。这 10 个字节将保持分配状态,直到没有对这 10 个字节的任何部分的引用为止。

例如,释放尾字节,

package main

import "fmt"

func main() {
arr := make([]byte, 0, 10)
arr = append(arr, []byte{1, 1, 1}...)

// free tail bytes:
fmt.Println(len(arr), cap(arr), &arr[0], arr)
arr = append(make([]byte, 0, len(arr)), arr...)
fmt.Println(len(arr), cap(arr), &arr[0], arr)
}

Playground :https://play.golang.org/p/l6cbiBoMf4j

输出:

3 10 0x414020 [1 1 1]
3 3 0x414050 [1 1 1]

The Go Blog: Go Slices: usage and internals

关于go - GC是否处理数组的未指向部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58069237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com