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

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

指針 (GoLang)

指針 (GoLang)

Go
叮當貓咪 2022-10-10 18:06:50
這是一個菜鳥問題,請多多包涵。所以問題是為什么 f() 函數指向不同的地址。我的理解是變量 v 必須覆蓋舊值。package mainimport "fmt"var p = f()func f() *int {    v := 1    return &v}func main() {    fmt.Println(f())    fmt.Println(f())    fmt.Println(f())    fmt.Println(p)}//0xc0000140b0//0xc0000140b8//0xc0000140e0//0xc000014098
查看完整描述

2 回答

?
catspeake

TA貢獻1111條經驗 獲得超0個贊

編譯器檢測到v escapes該函數f,因此將其分配在堆上。每次調用f都會返回 的新實例v,這就是每次調用都會看到不同地址的原因。



查看完整回答
反對 回復 2022-10-10
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

給這個簡單的答案


Go 查找比當前堆棧幀壽命更長的變量,然后堆分配它們


基本上,變量 v 轉義了函數 f 堆棧幀并在堆中分配,這就是為什么您每次都會看到不同的地址打印的原因。


閱讀這篇關于逃逸分析的精彩介紹。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())語句不考慮轉義,因為傳遞給 Println 的值p是全局變量,因此它已經在堆中,因此不需要escape.


查看完整回答
反對 回復 2022-10-10
  • 2 回答
  • 0 關注
  • 84 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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