以此为例进行讲解
|
|
cap 扩容最小元素数
newcap 扩容后实际元素数
第一步确定新的空间大小newcap
如果cap大于2*oldcap
,那么newcap等于cap
否则
如果cap小于1024,newcap等于2*oldcap
否则newcap以1.25*newcap
循环增大直至newcap>=cap
在本例中cap为5,oldcap为2,cap大于2*oldcap,所以newcap等于5
代码如下,位置在$GOROOT/src/runtime/slice.go
|
|
第二步根据类型计算所需字节数
5*8字节=40字节
第三步利用roundupsize方法进行内存向上对齐
对齐大小与类型有关,具体见runtime/sizeclasses.go
,其中bytes/obj
的这一列是go中预定义的对象大小,最小是8b,最大是32K,
比如int64类型40字节为例,由于并没有size为40的类型,于是40向上取整,取到48,也就是6个元素(取整逻辑在roundupsize函数中)
最终ns的cap大小为6