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

时间:2015-10-23 09:58:14

标签: go empty-list

我有一个程序,我要制作很多很多切片,其中一些可能是空的:

nb := something() // something might return 0
slices = append(slices, make([]int, nb))

make([]int, 0)是否会分配一些内存,因此,虽然它们具有相同的行为,但它们的内存效率却低于nil切片?多少钱?

如果是这样,是否值得进行测试以避免无用的分配,或者测试的CPU时间成本是否值得在内存中保存(或任何其他原因不这样做)?

var sl slice
nb := something()
if nb > 0 {
    sl = make([]int, nb)
}
slices = append(slices, sl)

2 个答案:

答案 0 :(得分:4)

之间的分配内存没有区别
var a []T // nil slice

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

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

如果此代码属于程序的性能关键部分,则差异会产生......差异。在第一种情况下,您将切片标头置零,在第二种情况下,您将通过3-4次函数调用,一些范围检查上限和长度等,然后malloc返回指向零基础的指针。

答案 1 :(得分:3)

  

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

是的,它分配了一个切片头但没有支持数组。如果切片标头没有逃脱当前范围,则可以在堆栈上分配它。

  

比nil slice更低的内存效率

就所使用的内存而言,它们是相同的。

  

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

通常是的,比较int所需的3或4条指令与你需要进行内存分配和初始化所需的周期无关。