2 回答

TA貢獻1111條經(jīng)驗 獲得超0個贊
編譯器檢測到v
escapes
該函數(shù)f
,因此將其分配在堆上。每次調(diào)用f
都會返回 的新實例v
,這就是每次調(diào)用都會看到不同地址的原因。

TA貢獻1875條經(jīng)驗 獲得超3個贊
給這個簡單的答案
Go 查找比當(dāng)前堆棧幀壽命更長的變量,然后堆分配它們
基本上,變量 v 轉(zhuǎn)義了函數(shù) f 堆棧幀并在堆中分配,這就是為什么您每次都會看到不同的地址打印的原因。
閱讀這篇關(guān)于逃逸分析的精彩介紹。https://medium.com/a-journey-with-go/go-introduction-to-the-escape-analysis-f7610174e890
嘗試運行逃逸分析以查看所有逃逸的變量。
go build -gcflags="-m" main.go:
./main.go:7:2: moved to heap: v //points to v := 1
./main.go:12:15: moved to heap: v //points to fmt.Println(f())
./main.go:13:15: moved to heap: v //points to fmt.Println(f())
./main.go:14:15: moved to heap: v //points to fmt.Println(f())
請注意,最后一條fmt.Println(f())語句不考慮轉(zhuǎn)義,因為傳遞給 Println 的值p是全局變量,因此它已經(jīng)在堆中,因此不需要escape.
- 2 回答
- 0 關(guān)注
- 89 瀏覽
添加回答
舉報