关于golang:golangslice扩容后的长度是怎么算的

31次阅读

共计 794 个字符,预计需要花费 2 分钟才能阅读完成。

原来的 cap 计作 old_cap, 须要的 cap 计作 need_cap, 最初失去的 cap 计作 new_cap. 只探讨 need_cap > old_cap 的状况.

如果 need_cap > old_cap*2, new_cap = need_cap

如果 need_cap < old_cap*2, 且 old_cap < 1024, new_cap = old_cap*2

如果 need_cap < old_cap*2, 但 old_cap > 1024,则 new_cap=old_cap, 并在 new_cap<need_cap 的条件下, new_cap = new_cap*1.25. 因为 need_cap < old_cap*2, 所以最多也就循环 4 次. 在这种状况下如果 new_cap 溢出了, new_cap = need_cap.

附上源码

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}
        }
    }

举一些例子来阐明

  1. old=10, need=50, new=50
  2. old=10, need=14, new=20
  3. old=2000, need=3000, new=old*1.25*1.25=3125
  4. old=MaxInt/2+1, need=MaxInt-1,因为 old* 2 溢出,new=MaxInt-1

又一次体现了缩小内存迁徙和缩小内存节约之间的衡量

正文完
 0