亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

我在看 go101 網(wǎng)站的 類型不安全指針[1](來源)[2] 一文時,偶然發(fā)現(xiàn)了runtime[3] 庫的一個有趣的新方法 runtime.KeepAlive()[4] 的一個用法。剛開始我對于怎么使用它是很困惑的, 那么按我的性格肯定要探究它是怎么工作的。

runtime.KeepAlive 所做的事就是使一個變量保持 '存活',這就意味著它(或者它引用的變量)不會被垃圾收集,而且它所注冊的任何終止器(finalizer)都不會被執(zhí)行。這個文檔[5] 中有一個如何使用它的例子。我的第一個疑問是為什么在代碼中 runtime.KeepAlive() 的使用時機(jī)那么的靠后;我比較希望它能夠更早的被調(diào)用,就像終止器被注入時,但是后來我明白了它這樣做的真正意圖。簡而言之, runtime.KeepAlive() 是調(diào)用一下變量。顯而易見的,一個變量直至它的最后一次使用期間都是存活的,所以如果你在后面使用一個變量,那么 Go 必須讓它一直存活到最后使用的時候。

一方面,runtime.keepAlive 沒有什么神奇的地方;任何一種使用某個變量的方式,都會使它保持存活。另一方面,runtime.KeepAlive() 是一種很重要的魔法,它表示 Go 保證了你所使用的變量不會被優(yōu)化清除掉,因為編譯器能明白沒有什么能真正依賴于你的使用。雖然有很多其它的方式來使用一個變量,但即使是最聰明的方式也很容易受到編譯器的影響,最聰明的方式也會有不利的一面,他們會影響 Go 的智能合理逃逸分析[6],強(qiáng)行將一個本屬于本地棧的變量分配到堆上。

關(guān)于 runtime.KeepAlive() 的另一個特殊戲法是它的是實現(xiàn)方式,代碼里什么都沒做。實際上,它不是作為一個被調(diào)用的函數(shù),而是由 ssa.go[7] 實現(xiàn)的編譯器內(nèi)部實現(xiàn),類似于 unsafe.Pointer。當(dāng)你的代碼中使用了 runtime.KeepAlive(),Go 編譯器會設(shè)置一個名為 OpKeepAlive 的靜態(tài)單賦值(SSA),然后剩余的編譯就會知道將這個變量的存活期保證到使用了 runtime.KeepAlive() 的時刻。

(閱讀 ssa.go 的初始化函數(shù)是很有趣的。不出所料,有許多語義化包函數(shù)調(diào)用被直接映射到將指令內(nèi)聯(lián)在代碼中,如 math.Sqrt。有些是平臺相關(guān)的,包括 bits[8] 的函數(shù))

runtime.KeepAlive() 是一個特別的魔法有一個直接的后果就是你不能得到它的地址。如果你這樣做的話, Go 會報錯:

./tst.go:20:22: cannot take the address of runtime.KeepAlive

我不知道 Go 是否會聰明地優(yōu)化掉一個只調(diào)用 runtime.KeepAlive 的函數(shù), 但希望你永遠(yuǎn)不需要間接調(diào)用 runtime.KeepAlive。

PS:盡管我很想說沒有人應(yīng)該需要對分配在棧上的本地變量(包括參數(shù))調(diào)用 runtime.KeepAlive,因為在函數(shù)返回之前棧是不會被回收的,但這是一個危險的假設(shè)。編譯器可以非常聰明地為兩個不同的、沒有重疊生存期的變量重用堆棧槽,或者簡單地告訴垃圾收集它已經(jīng)完成了某些工作(例如,用 nil 覆蓋指向?qū)ο蟮闹羔槪?/p>


via: https://utcc.utoronto.ca/~cks/space/blog/programming/GoRuntimeKeepAliveNotes

作者:ChrisSiebenmann[9]譯者:yuhang-dong[10]校對:unknwon[11]

本文由 GCTT[12] 原創(chuàng)編譯,Go 中文網(wǎng)[13] 榮譽(yù)推出

參考資料

[1]

類型不安全指針: https://go101.org/article/unsafe.html

[2]

(來源): https://old.reddit.com/r/golang/comments/8ll6lf/how_to_safely_use_typeunsafe_pointers_in_go/

[3]

runtime: https://golang.org/pkg/runtime/

[4]

runtime.KeepAlive(): https://golang.org/pkg/runtime/#KeepAlive

[5]

這個文檔: https://golang.org/pkg/runtime/#KeepAlive

[6]

Go 的智能合理逃逸分析: https://utcc.utoronto.ca/~cks/space/blog/programming/GoReflectEscapeHack

[7]

ssa.go: https://github.com/golang/go/blob/master/src/cmd/compile/internal/gc/ssa.go#L2828

[8]

bits: https://golang.org/pkg/math/bits/

[9]

ChrisSiebenmann: https://utcc.utoronto.ca/~cks/space/People/ChrisSiebenmann

[10]

yuhang-dong: https://github.com/yuhang-dong

[11]

unknwon: https://github.com/unknwon

[12]

GCTT: https://github.com/studygolang/GCTT

[13]

Go 中文網(wǎng): https://studygolang.com/

分享到:
標(biāo)簽:runtime KeepAlive
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定