如果 Grow
增长了一个切片,我们可以对新增元素的零性做出哪些假设?当前实现保证它们是零。我们能记录这个事实吗?
我有一个循环看起来像这样:
var s []T = ... // possibly a pooled slice
mustZero := true // we do not know the cleanliness of unused capacity
for hasMore() {
if len(s) == cap(s) {
s = slices.Grow(s, 1)
mustZero = false // TODO: Is it safe to assume extended elements are zero?
}
s = s[:len(s)+1]
e := &s[len(s)-1]
if mustZero {
*e = T{} // T may be large, so we want to avoid doing this if possible
}
mergeInto(e)
}
作为优化,它依赖于 slices.Grow
用零元素扩展切片,但这不是一个文档化的保证。
cc @ianlancetaylor
3条答案
按热度按时间hsvhsicv1#
我的第一个想法是我们不应该假设
Grow
会在长度和容量之间将元素归零。特别是,如果容量已经足够大,我可以很容易地想象出一个版本的Grow
,它会保留切片不变。n3h0vuf22#
我认为将
new[len(old):cap(old)]
的行为定义为未定义是可以的。问题在于确保new[cap(old):cap(new)]
始终被初始化为零。我无法想象任何情况下不会被初始化为零,因为从运行时(无论是通过make
还是append
)分配的新切片都应该返回零初始化的元素。gmxoilav3#
好的,没问题。