亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Golang轉義分析中'leak/leaking param'是什么意思

Golang轉義分析中'leak/leaking param'是什么意思

Go
Qyouu 2022-11-23 20:40:55
func main() {        i1 := 1    A1(&i1)}func A1(i1 *int) *int {    return i1}而逃逸分析的結果是./main.go:18:9: parameter i1 leaks to \~r1 with derefs=0:./main.go:18:9:   flow: \~r1 = i1:./main.go:18:9:     from return i1 (return) at ./main.go:19:2./main.go:18:9: leaking param: i1 to result \~r1 level=0parameter i1 leaks to \~r1 with derefs=0和是什么意思leaking param: i1 to result \~r1 level=0首先我嘗試谷歌golang escape leaking,最相關的結果是在escape-analysis-shows-channel-as-leaking-param的評論中“你為什么那么想?” 可以合理地假設泄漏是壞的并且與其閥桿泄漏有關。我正在努力想出一個泄漏是一件好事的示例上下文,例如泄漏桶、泄漏油箱、泄漏、泄漏電容器、泄漏船、泄漏抽象。對于高性能 go 專家來說這可能是顯而易見的,但對于我們其他人來說,鏈接到文檔并簡要說明泄漏參數指的是什么會很有幫助和我想問的是同一個問題,但是之后就沒有回復了。然后我嘗試閱讀打印這些結果的源代碼。在compile/internal/escape/leaks.go中,我找到了評論// 泄漏表示來自參數的一組賦值流// 到堆或它的任何函數(第一個 numEscResults)// 結果參數。但我無法理解這一點,是否有任何官方文件來表示它。此外,在源代碼中我發現了一個問題。如果之后的結果參數numEscResults(7)會在運行時逃逸到堆中?
查看完整描述

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 源代碼的經驗中猜測它是一個值不會減慢太多編譯速度,但會保留對大多數函數的優化


查看完整回答
反對 回復 2022-11-23
  • 1 回答
  • 0 關注
  • 376 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號