go slices: grow应该记录扩展元素的零性,

t1qtbnec  于 8个月前  发布在  Go
关注(0)|答案(3)|浏览(218)

如果 Grow 增长了一个切片,我们可以对新增元素的零性做出哪些假设?当前实现保证它们是零。我们能记录这个事实吗?
我有一个循环看起来像这样:

  1. var s []T = ... // possibly a pooled slice
  2. mustZero := true // we do not know the cleanliness of unused capacity
  3. for hasMore() {
  4. if len(s) == cap(s) {
  5. s = slices.Grow(s, 1)
  6. mustZero = false // TODO: Is it safe to assume extended elements are zero?
  7. }
  8. s = s[:len(s)+1]
  9. e := &s[len(s)-1]
  10. if mustZero {
  11. *e = T{} // T may be large, so we want to avoid doing this if possible
  12. }
  13. mergeInto(e)
  14. }

作为优化,它依赖于 slices.Grow 用零元素扩展切片,但这不是一个文档化的保证。
cc @ianlancetaylor

hsvhsicv

hsvhsicv1#

我的第一个想法是我们不应该假设Grow会在长度和容量之间将元素归零。特别是,如果容量已经足够大,我可以很容易地想象出一个版本的Grow,它会保留切片不变。

n3h0vuf2

n3h0vuf22#

我认为将 new[len(old):cap(old)] 的行为定义为未定义是可以的。问题在于确保 new[cap(old):cap(new)] 始终被初始化为零。我无法想象任何情况下不会被初始化为零,因为从运行时(无论是通过 make 还是 append)分配的新切片都应该返回零初始化的元素。

gmxoilav

gmxoilav3#

好的,没问题。

相关问题