为了账号安全,请及时绑定邮箱和手机立即绑定

在 go 中,是否值得避免创建大小为 0 的切片?

在 go 中,是否值得避免创建大小为 0 的切片?

Go
元芳怎么了 2021-11-15 20:53:06
我有一个程序,我将在其中制作很多切片,其中一些可能是空的:nb := something() // something might return 0slices = append(slices, make([]int, nb))是否make([]int, 0)分配了一些内存,因此nil尽管它们共享相同的行为,但内存效率不如切片?到多少?如果是这样,是否值得进行测试以避免无用的分配,或者测试的 CPU 时间成本是否不值得节省内存(或任何其他不这样做的原因)?var sl slicenb := something()if nb > 0 {    sl = make([]int, nb)}slices = append(slices, sl)
查看完整描述

2 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

之间分配的内存没有区别

var a []T // nil slice

a := make([]T, 0) // zero-length, zero-capacity, non-nil slice

不同之处在于切片标头内容。在第二种情况下,切片指针包含一些固定地址,对于所有 0 大小的分配都是相同的。

如果此代码位于程序的性能关键部分,则差异会产生……相当大的差异。在第一种情况下,您将切片标头归零,在第二种情况下,您会经历 3-4 次函数调用,在 malloc 返回指向零基的指针之前,对 cap 和 length 进行一些范围检查等。


查看完整回答
反对 回复 2021-11-15
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

make([]int, 0) 是否分配了一些内存

是的,它分配了一个切片头,但没有后备数组。如果切片头没有转义当前范围,它可能会在堆栈上分配。

内存效率低于零切片

在使用的内存方面,它们是相同的。

是否值得进行测试以避免无用的分配

一般来说,与执行内存分配和初始化所需的周期相比,比较 int 所需的 3 或 4 条指令算不了什么。


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信