成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 要違背初心嗎?新提案:手動管理內存

開發 前端
本提案所提到的 Arena,指的是一種從一個連續的內存區域分配一組內存對象的方式。優點是 arena 中的對象分配通常比一般的內存分配更有效率,所分配的對象可以一次性釋放,以此達到內存管理或垃圾收集的開銷最小。

背景

由于手動管理內存普遍會給程序員帶來一定的心智負擔,提高一門編程語言的入門門檻(還記得大學寫 OC 時經常有同學寫著寫崩了...)。

對應到 Go 語言上,他是一門帶垃圾回收的編程語言。也就是說不需要程序員手動的去管理、釋放程序的內存。

圖片

無需手動管理也是 Go 核心開發團隊一直引以為傲的特性之一。

最近有人發起了一個新提案《proposal: arena: new package providing memory arenas》,引起了非常廣泛的討論。

如下圖:

圖片

接下來我們將面向該提案進行學習和了解。

新提案

本提案所提到的 Arena,指的是一種從一個連續的內存區域分配一組內存對象的方式。優點是 arena 中的對象分配通常比一般的內存分配更有效率,所分配的對象可以一次性釋放,以此達到內存管理或垃圾收集的開銷最小。

其建議在 Go 的標準庫中支持 arena。標準 API 如下:

package arena

type Arena struct {
// contains filtered or unexported fields
}

// New allocates a new arena.
func New() *Arena

// Free frees the arena (and all objects allocated from the arena) so that
// memory backing the arena can be reused fairly quickly without garbage
// collection overhead. Applications must not call any method on this
// arena after it has been freed.
func (a *Arena) Free()

// New allocates an object from arena a. If the concrete type of objPtr is
// a pointer to a pointer to type T (**T), New allocates an object of type
// T and stores a pointer to the object in *objPtr. The object must not
// be accessed after arena a is freed.
func (a *Arena) New(objPtr interface{})

// NewSlice allocates a slice from arena a. If the concrete type of slicePtr
// is *[]T, NewSlice creates a slice of element type T with the specified
// capacity whose backing store is from the arena a and stores it in
// *slicePtr. The length of the slice is set to the capacity. The slice must
// not be accessed after arena a is freed.
func (a *Arena) NewSlice(slicePtr interface{}, cap int)

這一實踐已經在 Google 得到了應用,且在一些大型應用程序中節省了高達 15% 的CPU和內存使用,這主要是由于減少了垃圾收集的CPU時間和堆內存使用所帶來的效果。

arena 若成為標準庫的使用的例子:

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()
}

手動調用 arena.New? 方法分配 arena 內存,再調用 Free 方法進行釋放。

當然,一般提案中所提到的 arena 并不會在一門帶垃圾回收的編程語言中實現。因為會操作到內存就有可能會不安全,不符合帶垃圾回收的語言定義。

該庫底層采取了動態檢查來確保 arena 釋放內存的操作是安全的。若出現異常情況,就會終止釋放。

爭論

圍繞這這個新的提案,評論區的網友們爭議的非常多。有的會疑惑,為什么一定要放在標準庫,放第三方庫不行嗎?

實際上在第三方庫中很難安全地做到這一點,因為一個在 arena 庫中分配的變量,他包含指向外部的內存指針,要確保性能下讓 GC 知道他,否則可能會導致錯誤的釋放。

圖片

當然,也有人提出,這 Go 就變成像 C++ 一樣,忘記 free、重復 free、提前 free,與 Go 原先標榜的簡潔相差甚遠。

總結

現階段該提案還在積極探討的階段,原型代碼也已經提交《runtime: prototype CL showing possible implementation of arenas》有興趣的小伙伴可以抽時間看看。

這個提案爭議較大,你很難說他是一個庫,還是一個語言的根本性變更。你一旦在原生標準庫支持了,其他關聯的也必然會支持其 API,自然而然就植入進去了,與 “unsafe” 標準庫定位一致,都是不安全的因素。

大家怎么看?

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2021-02-25 15:51:41

Go語言模糊測試功能

2024-12-03 08:47:01

2023-12-27 08:03:53

Go優化代碼

2022-10-24 08:55:13

Go工具鏈開發者

2024-03-12 09:10:21

GoarenaAPI

2021-12-13 08:52:42

Go 泛型

2021-08-09 10:36:20

GoSlices Maps

2024-11-19 09:10:19

迭代器Go語言

2023-02-26 22:47:45

Go管理內存

2022-07-13 08:53:28

函數Go語言

2024-06-05 08:47:20

Go語言方式

2023-10-30 08:49:23

Go提案離職

2021-12-27 07:59:50

ECMAScript JSON模塊Node.js

2022-01-11 12:13:33

JavaScript編程語言

2023-06-27 13:35:04

RedHat開源商業

2023-08-14 08:00:00

Go 標準庫HTTP 路由器

2021-07-27 13:08:52

微軟Chrome新提案

2021-01-14 05:20:48

Go語言泛型

2022-09-05 08:55:15

Go2提案語法

2010-08-26 10:20:43

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级视频在线免费观看 | 国产91丝袜在线播放 | 男女下面一进一出网站 | 中文字幕精品一区二区三区在线 | 视频在线日韩 | 日韩精品成人免费观看视频 | jlzzjlzz欧美大全| 久久久网| 精品一区国产 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 狠狠ri| 国产精品夜夜夜一区二区三区尤 | 精品综合 | 一区二区影院 | 97av视频 | 亚洲啊v在线 | 欧美成人免费在线视频 | 亚洲成人在线免费 | 天天草天天操 | 激情网五月天 | 中文字幕国 | 成人久草 | 国产精品综合色区在线观看 | 日日日色 | 国产农村妇女精品一二区 | 亚洲国产精品一区 | 欧美日韩福利视频 | 精品国产一区二区在线 | 亚洲美女网站 | 婷婷精品 | 国产精品成人在线观看 | 羞羞视频在线免费 | 国产精品无 | 日本免费一区二区三区四区 | 色婷综合网| 99精品亚洲国产精品久久不卡 | 免费视频久久 | 蜜臀网| 亚洲a在线视频 | 97av视频在线观看 | 亚洲男人网 |