go slice 扩容

2022-01-19  本文已影响0人  wwq2020

简单总结

1 append后cap超过当前cap的2倍,则采用append后的cap作为cap
2 append后cap未超过当前cap的2倍,且小于1024,则使用当前cap的2被作为cap
3 append后cap未超过当前cap的2倍,但大于等于1024,则通过对当前cap多次*1.25尝试找出大于append后的cap的值
3.1 如果未溢出,则使用这个计算出来的值
3.2 如果溢出了,则使用append后的cap

相关源码

go中append操作对应的源码在标准库的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
            }
        }
    }
    ...
}
上一篇 下一篇

猜你喜欢

热点阅读