Golang切片扩容学习笔记
在学习golang切片时看到说golang的扩容机制是小于1024时进行double,超过1024后每次增加1/4,但是自己尝试后并非如此,于是扒了下golang的源码研究一番。
代码演示
| |
一开始确实成指数上涨,每次double,但是512以后变不是1024,而变成了848。
看一下slice.go的更新日志 发现在2021年9月8日有一个更新记录

此处可以发现扩容机制发生了变化
源码
| |
由于我们每次都是append 1个元素进入,所以后面不会出现newLen > doublecap的情况,都会走进下面的分支
| |
threshold中文的意思是门槛,此处也是很贴切了。
当oldcap是256时带入分支,可以得到newcap值为512。
当oldcap是512时带入分支,通过计算可知newcap=512+(512+256*3)/4=832
但是前面的结果是848,和计算的结果并不一致,那是什么原因导致的呢?
内存对齐
继续看后面的代码,可以发现,在确定最后的newcap值前要进行内存对齐。
不同类型的切片其内存对齐的代码是不同的。
| |
| |
之前我们计算出来的长度是832 换算成bit后是 6656 在class_to_size向上取整后为 6784 6784/8= 848
这就解释了为什么新的cap是848
其他类型切片扩容容量(append步长为1)
string int64 float64
| |
int32 float32
| |
bool
| |