栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

Go切片扩容机制

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Go切片扩容机制

首先,我们创建一个数组

然后我们又声明了一个s1变量,把数组s分片,此时s1是一个切片,切片有三个域,其中一个存的就是数组指针,它就指向了这个数组1号下标,然后长度为2,容量为5。

然后我们再声明一个s2变量,也是把数组s分片,此时就是如下图所示。

如果此时我们修改s的值,如果在s1和s2的范围中,s1和s2的值也会改变,因为s1和s2都指向了这个数组。

而此时如果我们通过s2 = append(s2, 999)来给s2追加一个值,会发生什么? 可见s2已经无法在原来的数组上追加了,此时再追加元素,就会触发扩容机制。

扩容机制:

比如我们有一个容量为2的切片,此时再添加3个元素,我们的容量至少要扩到5,5就是我们的预估容量。

那么我们此时就要判断,如果原来的容量翻倍还是小于这个预估容量,那么我们直接让容量等于预估容量。

否则,看原来切片的容量如果小于1024,那么直接翻倍,如果大于等于1024,每次扩1/4,直到新容量超过所需容量。

第三步就是申请内存,在很多语言中,内存分配不是直接和操作系统交互的,而是和语言自身的内存管理模块交互,而自身的内存管理模块会提前先向操作系统申请一批内存,分成常用的规格管理起来。

当我们申请内存的时候,它会给我们分配足够大且最接近的规格,比如下面的24字节,就会被分配32个字节。

在我们第二步中,我们知道最终的预估容量是5,64位下就需要申请5 * 8 = 40byte字节存放扩容后的底层数组,而实际上申请时会匹配到48字节,48个字节能装48 / 8 = 6个元素(如果是32位操作系统,把前面的8变成4就可以了),这就是我们扩容后的容量了。

此时会创建一个新数组,这个新数组会首先把原数组的内容拿过来,然后在基础上添加元素,再让这个切片指向这个数组。

此时再修改s的内容,不会影响到s2。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944217.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号