[x, y]我在 Go中有一個(gè)坐標(biāo)對(duì) ( ) 的 FIFO 隊(duì)列:type Copair [2]inttype Queue []Copairvar q = Queue{ ... preloaded values ... }API 定義如下,其中重要的部分是pop()函數(shù):func (q Queue) push(p Copair) { q = append(q, p)}func (q Queue) pop() (error, Copair) { if q != nil && len(q) >= 1 { q = q[1:] return nil, q[0] } else { return errors.New("index out of range [0]"), nil }}在那q = q[1:]我正在重新構(gòu)建切片,理論上它應(yīng)該只需要在內(nèi)存中更改一個(gè)地址,因此是一個(gè)恒定時(shí)間的操作?,F(xiàn)在,我們正在逐漸丟失堆上的字節(jié)(或者誰(shuí)知道,Go 的逃逸分析可能足夠聰明,可以將它放在堆棧上),我希望垃圾收集器可以回收這些字節(jié)以避免內(nèi)存泄漏,最終我們將到達(dá)堆邊界,運(yùn)行時(shí)將不得不將整個(gè)隊(duì)列復(fù)制到其他地方,這肯定是線(xiàn)性時(shí)間操作。但...切片重構(gòu)是通過(guò)q = q[1:]恒定時(shí)間操作執(zhí)行的,還是與隊(duì)列大小成線(xiàn)性關(guān)系?如果(我懷疑)答案是 oh-so-very-Go “它取決于”,它依賴(lài)的條件是什么,是否有任何簡(jiǎn)單的經(jīng)驗(yàn)法則可以解決這個(gè)問(wèn)題?
2 回答

楊__羊羊
TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
切片是一個(gè)恒定時(shí)間的操作。切片頭包含指向底層數(shù)組、大小和容量的指針。該操作q:=q[1:]
只需使用調(diào)整后的數(shù)組指針、大小和容量創(chuàng)建一個(gè)新標(biāo)頭。

慕標(biāo)5832272
TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
這q[1:]
是一個(gè)切片表達(dá)式,它“無(wú)非”只是創(chuàng)建一個(gè)新的切片頭,即reflect.SliceHeader
. 它只是 3 個(gè)整數(shù)值。
當(dāng)然會(huì)檢查索引范圍,例如,如果q
切片為空,則會(huì)導(dǎo)致運(yùn)行時(shí)恐慌。
- 2 回答
- 0 關(guān)注
- 141 瀏覽
添加回答
舉報(bào)
0/150
提交
取消