您好,登錄后才能下訂單哦!
這篇文章主要講解了“Go1.20 arena新特性是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Go1.20 arena新特性是什么”吧!
Arena 指的是一種從一個連續(xù)的內(nèi)存區(qū)域分配一組內(nèi)存對象的方式。優(yōu)點比一般的內(nèi)存分配更有效率,也可以一次性釋放。當(dāng)然了,它的重點是要手動管理內(nèi)存。
Go 團(tuán)隊希望加進(jìn) Go 特性中,示例代碼如下:
import ( “arena” … ) type T struct { val int } func main() { a := arena.New() var ptrT *T a.New(&ptrT) ptrT.val = 1 var sliceT []T a.NewSlice(&sliceT, 100) sliceT[99].val = 4 a.Free() }
手動調(diào)用 arena.New
方法分配 arena 內(nèi)存,再調(diào)用 Free
方法進(jìn)行釋放。
簡單來講就是可以手動管理內(nèi)存,就可以做很多事了,也 “容易” 崩。
這個提案一直在 issues 上適度的爭議討論,@Michael Knyszek 大佬代碼寫的很快,已經(jīng)直接提交上去了...直到最近被人發(fā)現(xiàn),讓他更新進(jìn)度。
已經(jīng)明確:Go1.20 將會支持 arena 特性,通過 GOEXPERIMENT=arena
來打開,接受大家的 review 和使用,抗阻很小。
已實現(xiàn) API 和原提案不同的地方有:
API 使用了泛型,例如:arena.New[int](myArena "int")
。
Arena 的 塊大小是 8 MiB 而不是 64 MiB,似乎在更多情況下提供了更好的性能。
MSAN 和 ASAN 模式可用于識別不會導(dǎo)致崩潰的 use-after-free 錯誤(內(nèi)存損壞應(yīng)該仍然是不可能的)。 需注意,這些模式對非 cgo 的 Go 程序幾乎沒有作用。Arena 是個例外。
另外根據(jù)社區(qū)的反饋,可能還會出現(xiàn)配套類型的 Arena。如下函數(shù)簽名:
// MakeMap creates a new map[K]V with the provided capacity. // The map[K]V must not be used after the arena is freed. // Accessing the underlying storage of the map after free may result in a fault, // but this fault is also not guaranteed. func MakeMap[K comparable, V any](a *Arena, cap int "K comparable, V any") map[K]V { ... }
感謝各位的閱讀,以上就是“Go1.20 arena新特性是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Go1.20 arena新特性是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。