第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

Go
阿晨1998 2022-05-23 16:34:09
我正在嘗試使用 Slice 實現(xiàn)隊列。但是切片的問題在于,一旦切片,修剪后的元素會繼續(xù)占用空間。因此,我想知道是否無論如何我可以刪除占用的空間,或者換句話說,取消分配修剪元素的空間。queue := make([]int, 0)//Enqueuequeue = append(queue, 1)queue = append(queue, 2)queue = append(queue, 3)//DequeuedeletedElement := queue[0]//--unallocate the space occupied by queue[0]queue = queue[1:]
查看完整描述

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)這一點。


查看完整回答
反對 回復(fù) 2022-05-23
  • 1 回答
  • 0 關(guān)注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號