1 回答

TA貢獻1853條經(jīng)驗 獲得超18個贊
queue是一個指向后備數(shù)組的切片。切片覆蓋(或在重新切片時可能覆蓋)后備數(shù)組的多大部分并不重要,只要有對后備數(shù)組的引用,它將被保存在內(nèi)存中。當不再引用它時,垃圾收集器將釋放它。
當你添加新元素到你的queueusingappend()時,如果后備數(shù)組不能容納額外的元素,它會自動分配一個新數(shù)組,將現(xiàn)有元素復(fù)制到它,然后舊數(shù)組將不再被引用queue。如果沒有其他對它的引用,它將被釋放。
如果您不想等待這種情況發(fā)生,您唯一的選擇是創(chuàng)建一個新數(shù)組或切片,將隊列元素復(fù)制到其中,然后更新queue切片標題以指向這個新切片(所以舊的可以釋放)。
例如:
//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. 所以你不應(yīng)該在每次出隊后都這樣做,但前提是未使用的空間真的很大。
另請注意,在創(chuàng)建新切片時,您可以使用更大的容量,以便新元素可以排隊而不會導(dǎo)致立即重新分配,例如:
queue = append(make([]int, 0, 2*len(queue)), queue...)
一般來說,我永遠不會這樣做。如果您使用隊列,您將不斷地排隊和出列元素。所以添加元素自然會實現(xiàn)這一點。
- 1 回答
- 0 關(guān)注
- 117 瀏覽
添加回答
舉報