slice扩容

2021-12-24  本文已影响0人  草莓2020

原文:【Golang】slice类型存什么?make和new?slice和数组?扩容规则?_哔哩哔哩_bilibili

第一步:预估扩容后的容量newCap

image.png

第二步:newCap个元素需要多大内存

所需内存 = 预估容量 * 元素类型大小,

第三步:匹配合适的内存规格

这里并不是直接分配所需内存容量的大小。
这是因为在许多编程语言中,申请分配内存并不是与操作系统交涉,而是和语言自身实现的内存管理模块,它会提前向操作系统申请一批内存,分成常用的规格管理起来,我们申请内存是,它会帮我们匹配到足够大且最接近的规格

image.png

示例1

ints:=[]int{1,2} // 扩容前容量oldCap=2
ints=append(ints,3,4,5) // 至少要扩容到cap=5

第一步:预估newCap

2*2=4<5 (oldCap * 2 < cap)
所以newCap=5

第二步:预估内存

newCap * 8 = 5 * 8byte = 40byte (所需内存 = 预估容量 * 元素类型大小)

第三步 匹配合适内存

假设内存管理模块 申请的内存规格有8,16,32,48,64,...
那么实际会分配到48byte内存

示例2

image.png
上一篇 下一篇

猜你喜欢

热点阅读