栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么具有奇数的切片容量与具有偶数的行为不同

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么具有奇数的切片容量与具有偶数的行为不同

简短答案

它正在舍入切片容量以填充分配的内存块。

长答案

让我们看一下Go1.5.1源代码:

https://github.com/golang/go/blob/f2e4c8b5fb3660d793b2c545ef207153db0a34b1/src/cmd/compile/internal/gc/walk.go#L2895告诉我们,

append(l1,l2...)
扩展为

s := l1if n := len(l1) + len(l2) - cap(s); n > 0 {    s = growslice_n(s, n)}s = s[:len(l1)+len(l2)]memmove(&s[len(l1)], &l2[0], len(l2)*sizeof(T))

我们感兴趣的部分在

growslice_n
此处定义:https
:
//github.com/golang/go/blob/f2e4c8b5fb3660d793b2c545ef207153db0a34b1/src/runtime/slice.go#L36

再深入一点,我们发现:

newcap := old.capif newcap+newcap < cap {    newcap = cap} else {    for {        if old.len < 1024 { newcap += newcap        } else { newcap += newcap / 4        }        if newcap >= cap { break        }    }}capmem := roundupsize(uintptr(newcap) * uintptr(et.size))newcap = int(capmem / uintptr(et.size))

roundupsize
在此处定义:https
:
//github.com/golang/go/blob/f2e4c8b5fb3660d793b2c545ef207153db0a34b1/src/runtime/msize.go#L178

// Returns size of the memory block that mallocgc will allocate if you ask for the size.func roundupsize(size uintptr) uintptr {    if size < _MaxSmallSize {        if size <= 1024-8 { return uintptr(class_to_size[size_to_class8[(size+7)>>3]])        } else { return uintptr(class_to_size[size_to_class128[(size-1024+127)>>7]])        }    }    if size+_PageSize < size {        return size    }    return round(size, _PageSize)}

它是在那里介绍的:https : //groups.google.com/forum/#!topic/golang-
prereviews/bFGtI4Cpb_M

当切片增加时,请考虑分配的内存块的大小。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484269.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号