原文:【Golang】slice类型存什么?make和new?slice和数组?扩容规则?_哔哩哔哩_bilibili
第一步:预估扩容后的容量newCap
第二步:newCap个元素需要多大内存
所需内存 = 预估容量 * 元素类型大小,
第三步:匹配合适的内存规格
这里并不是直接分配所需内存容量的大小。
这是因为在许多编程语言中,申请分配内存并不是与操作系统交涉,而是和语言自身实现的内存管理模块,它会提前向操作系统申请一批内存,分成常用的规格管理起来,我们申请内存是,它会帮我们匹配到足够大且最接近的规格
示例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内存