在 Golang 中,您可以使用以下语法为 slice 分配内存:
my_slice := make( []int, 0 )
稍后我可以使用内置追加函数添加元素:
my_slice := append(my_slice, 23)
我的问题是,如果稍后我们可以根据需要继续添加项目,那么在“制作” slice 时给出零(或 2 或 5 或其他)有什么区别?
是否可以通过尝试猜测 slice 最终拥有的容量来获得性能奖励?
最佳答案
区别在于 slice 的内存是预先分配的,len(mySlice)
返回总 slice 长度。
就性能而言,预先分配大小是有益的,因为当您调用 a = append(a, n)
时,会发生以下情况:
它调用内置的 append 函数,为此它首先复制
a
slice ( slice header ,后备数组不是 header 的一部分),并且它必须创建一个临时 slice 对于将包含值n
的可变参数。如果
a = a[:len(a)+1]
有足够的容量,它必须重新 slicea
- 这涉及分配新的在 append 函数中 slice 到a
。如果 a 没有足够大的容量来“就地”执行追加,则必须分配一个新数组,复制 slice 中的内容,然后执行分配/追加。然后将
n
赋值给[len(a)-1]
。然后从 append 函数返回新的 slice ,并将这个新 slice 赋值给局部变量
a
。
与 a[i] = n
相比,这是一个简单的分配。
关于go - 制作 slice 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808721/