go - 制作 slice 大小

标签 go allocation

在 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] 有足够的容量,它必须重新 slice a - 这涉及分配新的在 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/

相关文章:

c - 如何返回仅包含偶数/奇数的数组并删除不必要的单元格?

google-app-engine - 在 golang 中将字符串转换为 json,反之亦然?

security - 确保 Golang 中 exe 文件的完整性

go - 在 Golang 中打印所有局部变量

c - C 中的内存分配和传递多个数字

php - 我的 javascript 卡住了屏幕,没有错误,只是导航器不起作用

c - 对于二维动态分配数组的循环错误

arrays - 如何将 []string 转换为 ...string

go - Golang在控制台中显示一些奇怪的字符

c++ - 使用线程时的内存分配问题