原来的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 } } }
举一些例子来阐明
- old=10, need=50, new=50
- old=10, need=14, new=20
- old=2000, need=3000, new=old*1.25*1.25=3125
- old=MaxInt/2+1, need=MaxInt-1, 因为old*2溢出,new=MaxInt-1
又一次体现了缩小内存迁徙和缩小内存节约之间的衡量