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

标签 go empty-list

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

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

make([]int, 0) 是否分配了一些内存,因此内存效率低于 nil slice ,尽管它们具有相同的行为?多少?

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

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

最佳答案

分配的内存之间没有区别

var a []T // nil slice

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

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

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

关于go - 在 go 中,是否值得避免创建大小为 0 的 slice ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33299616/

相关文章:

Go:为什么结构 "instantiated"与其他类型不同?

arrays - 空数组的 Julia 数组

java - Collections.emptyList() 与新实例

utf-8 - 截断 UTF 字符串中的最后一个 rune

go - 在 URL golang 中传递变量

docker - 如何使用本地 go 包构建 docker 镜像?

dictionary - 如何防止将类型用作映射键?

list - 从方案中的列表列表中删除空列表

r - 如何清空 R 中的列表?