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

In go, is it worth avoiding creating slices of size 0?

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

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)

Does make([]int, 0) allocates some memory

是的,它分配了一个切片 header 但没有后备数组。如果切片 header 没有脱离当前作用域,它可能被分配到堆栈上。

less memory efficient than a nil slice

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

is it worth doing a test to avoid useless allocations

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

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

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

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

如果此代码位于程序的性能关键部分,那么差异就会……非常不同。在第一种情况下,您将切片 header 归零,在第二种情况下,您经过 3-4 次函数调用,对上限和长度进行一些范围检查,等等。在 malloc returns 指向零的指针之前基地.