共计 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}
}
}
举一些例子来阐明
- 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
又一次体现了缩小内存迁徙和缩小内存节约之间的衡量
正文完