gpt4 book ai didi

go - 我可以在Golang中取消分配 slice 元素占用的空间吗?

转载 作者:行者123 更新时间:2023-12-01 21:18:25 25 4
gpt4 key购买 nike

我正在尝试使用Slice实现队列。但是 slice 的问题在于, slice 后,修剪后的元素会继续占据空间。因此,我想知道是否仍然可以删除占用的空间,换句话说就是取消分配修剪后的元素的空间。

queue := make([]int, 0)
//Enqueue
queue = append(queue, 1)
queue = append(queue, 2)
queue = append(queue, 3)
//Dequeue
deletedElement := queue[0]
//--unallocate the space occupied by queue[0]
queue = queue[1:]

最佳答案

queue是指向支持数组的 slice 。 slice 覆盖(或在 slice 时可能覆盖)支持块阵列的大小无关紧要,只要存在对支持阵列的引用,它将保留在内存中。当没有更多引用时,垃圾收集器将释放它。

当您使用queue将新元素添加到append()中时,如果支持数组无法容纳其他元素,它将自动分配一个新数组,将现有元素复制到该数组中,然后queue将不再引用旧数组。如果没有其他引用,它将被释放。

如果您不想等待发生这种情况,则唯一的选择是创建一个新的数组或 slice ,将队列元素复制到其中,然后更新queue slice header 以指向此新 slice (因此旧一个可以释放)。

例如:

//Dequeue
deletedElement := queue[0]
//--unallocate the space occupied by queue[0]
queue = queue[1:]

newQueue := make([]int, len(queue))
copy(newQueue, queue)
queue = newQueue

您可以稍微简化一下:
queue = append(make([]int, 0, len(queue)), queue...)

如您所见,这只是释放一个 int的空间,这是一项昂贵的操作。因此,仅在未使用空间很大时,才应在每次出队后执行此操作。

另请注意,在创建新 slice 时,您可以使用更大的容量,以便可以在不引起立即重新分配的情况下将新元素排队,例如:
queue = append(make([]int, 0, 2*len(queue)), queue...)

总的来说,我永远不会这样做。如果使用队列,则将不断对元素进行排队和出队。因此,添加元素自然会使其成为现实。

关于go - 我可以在Golang中取消分配 slice 元素占用的空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60861330/

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