1 回答

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
參數(shù) i1 泄漏到 ~r1 with derefs=0 和泄漏參數(shù)的含義是什么:i1 結(jié)果 ~r1 level=0
TLDL:如果您正在尋找分配,請(qǐng)忽略泄漏的參數(shù)并尋找“移動(dòng)到堆”的部分。
“泄漏參數(shù)”意味著該函數(shù)在返回后以某種方式使其參數(shù)保持活動(dòng)狀態(tài),這并不意味著它被移動(dòng)到堆中,實(shí)際上大多數(shù)“泄漏參數(shù)”都分配在堆棧上。
“r1”指的是函數(shù)的返回值,它從0開(kāi)始,所以“r1”指的是第二個(gè)返回值。(與 OP 提供的示例代碼不匹配,應(yīng)該是 r0),在第一個(gè)片段的情況下,它泄漏了“i1”,因?yàn)椤皉0 = i1”,所以第 0 個(gè)函數(shù)返回值是“i1”,因此是“i1” " 返回后必須保持活動(dòng)狀態(tài),“泄漏”給調(diào)用者
編譯器輸出中“泄漏參數(shù)”之前的部分是因?yàn)?OP 使用“-m -m”,它打印數(shù)據(jù)流圖。
對(duì)于 deref,來(lái)自 cmd/compile/internal/escape/escape.go 中的注釋?zhuān)?/p>
[...] 取消引用操作的數(shù)量減去尋址操作的數(shù)量被記錄為邊緣的權(quán)重(稱(chēng)為“derefs”)。
“級(jí)別”在當(dāng)前評(píng)論中沒(méi)有描述,自從我熟悉 gc 源代碼以來(lái)已經(jīng)有一段時(shí)間了,據(jù)我所知,它是內(nèi)存間接級(jí)別,間接 (*) 操作增量,地址 (&)遞減,因此這個(gè)函數(shù)
func A1(a **int) *int {
p := &a
return **p
}
應(yīng)該給出一個(gè) level=1 的泄漏參數(shù)a
。
此外,在源代碼中我發(fā)現(xiàn)了一個(gè)問(wèn)題。如果 numEscResults(7) 之后的結(jié)果參數(shù)會(huì)在運(yùn)行時(shí)逃逸到堆中?
是的,第 7 個(gè)之后取決于泄漏參數(shù)的所有結(jié)果(讀取、返回)都將移至堆,我不知道 7 的確切原因,但我可以從 gc 源代碼的經(jīng)驗(yàn)中猜測(cè)它是一個(gè)值不會(huì)減慢太多編譯速度,但會(huì)保留對(duì)大多數(shù)函數(shù)的優(yōu)化
- 1 回答
- 0 關(guān)注
- 372 瀏覽
添加回答
舉報(bào)