第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

指針 (GoLang)

指針 (GoLang)

Go
叮當(dāng)貓咪 2022-10-10 18:06:50
這是一個菜鳥問題,請多多包涵。所以問題是為什么 f() 函數(shù)指向不同的地址。我的理解是變量 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條經(jīng)驗 獲得超0個贊

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



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

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.


查看完整回答
反對 回復(fù) 2022-10-10
  • 2 回答
  • 0 關(guān)注
  • 89 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號