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

Go 要違背初心嗎?新提案:手動管理內(nèi)存

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

背景

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

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

圖片

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

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

如下圖:

圖片

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

新提案

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

其建議在 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)

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

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

手動調(diào)用 arena.New? 方法分配 arena 內(nèi)存,再調(diào)用 Free 方法進行釋放。

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

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

爭論

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

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

圖片

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

總結

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

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

大家怎么看?

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

2021-02-25 15:51:41

Go語言模糊測試功能

2024-12-03 08:47:01

2023-12-27 08:03:53

Go優(yōu)化代碼

2022-10-24 08:55:13

Go工具鏈開發(fā)者

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管理內(nèi)存

2022-07-13 08:53:28

函數(shù)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開源商業(yè)

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提案語法

2022-06-08 10:46:00

CSS前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产亚洲欧美在线视频 | 日韩有码在线播放 | 99亚洲精品 | 日韩在线不卡视频 | 69福利影院| 国际精品鲁一鲁一区二区小说 | 欧美精品日韩 | av电影一区 | 天天综合永久 | 国产精品日韩欧美一区二区三区 | av免费电影在线 | 亚洲精品福利在线 | 激情 婷婷 | 亚洲一区二区 | 一区二区av | 国产成人综合网 | 综合激情av | 一区二区三区影院 | 久久亚洲一区二区 | 国产第一页在线观看 | 91久久精品日日躁夜夜躁国产 | 日韩成人免费 | 欧美亚洲国语精品一区二区 | 日日夜夜天天 | 久久久亚洲成人 | 99爱国产| 久久精品毛片 | 在线播放日韩 | 久久精品国产一区二区三区不卡 | 91精品国产乱码久久久久久久 | 中文字幕在线视频一区二区三区 | 色爱综合网 | 啪视频在线 | 激情五月婷婷 | 亚洲国产精品一区二区三区 | 亚洲日本欧美日韩高观看 | 老司机成人在线 | 日韩在线观看网站 | 精品一区二区三区四区 | 欧美日韩黄色一级片 | 亚洲一二三在线 |