1 回答

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