golang slice 错误认知
很多人在博客看到 slice 扩容策略如下
- 当大于 1024 则1.5倍
- 大于1024则两倍
这个结论是错误的
a:= []int{1,2}
a= append(a,3,4,5)
// 如果是2倍应该 容量是8 但是实际 5
####### 查阅源码 runtime/slice.go
func growslice(et *_type, old slice, cap int) slice {
...
newcap := old.cap
doublecap := newcap + newcap
if cap > doublecap {
newcap = cap
} else {
if old.cap < 1024 {
newcap = doublecap
} else {
// Check 0 < newcap to detect overflow
// and prevent an infinite loop.
for 0 < newcap && newcap < cap {
newcap += newcap / 4
}
// Set newcap to the requested cap when
// the newcap calculation overflowed.
if newcap <= 0 {
newcap = cap
}
}
}
...
}
####### 源码得知是根据
- 容量计算的是否溢出 不溢出直接使用 增加的容量
- 根据 roundupsize 内存对齐函数 比较测算容量
- 不通的数据类型的 扩容长度也不一样
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/16208045.html