我有一个程序,我要制作很多很多切片,其中一些可能是空的:
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)
答案 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条指令与你需要进行内存分配和初始化所需的周期无关。