我可以取消分配 Golang 中切片元素占用的空间吗?

我正在尝试使用 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:]


阿晨1998
浏览 129回答 1
1回答

慕容森

queue是一个指向后备数组的切片。切片覆盖(或在重新切片时可能覆盖)后备数组的多大部分并不重要,只要有对后备数组的引用,它将被保存在内存中。当不再引用它时,垃圾收集器将释放它。当你添加新元素到你的queueusingappend()时,如果后备数组不能容纳额外的元素,它会自动分配一个新数组,将现有元素复制到它,然后旧数组将不再被引用queue。如果没有其他对它的引用,它将被释放。如果您不想等待这种情况发生,您唯一的选择是创建一个新数组或切片,将队列元素复制到其中,然后更新queue切片标题以指向这个新切片(所以旧的可以释放)。例如://DequeuedeletedElement := 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. 所以你不应该在每次出队后都这样做,但前提是未使用的空间真的很大。另请注意,在创建新切片时,您可以使用更大的容量,以便新元素可以排队而不会导致立即重新分配,例如:queue = append(make([]int, 0, 2*len(queue)), queue...)一般来说,我永远不会这样做。如果您使用队列,您将不断地排队和出列元素。所以添加元素自然会实现这一点。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go