我有一个程序,在这个程序中,我将制作大量的切片,其中一些可能是空的:
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)
发布于 2015-10-23 02:58:09
之间的分配内存没有差别。
var a []T // nil slice
和
a := make([]T, 0) // zero-length, zero-capacity, non-nil slice
不同之处在于片头内容。在第二种情况下,片指针包含一些固定地址,对于所有0大小的分配都是一样的.
如果这段代码在程序的性能关键部分,那么差异会使.差别很大。在第一种情况下,对片头执行零操作,在第二种情况下,在malloc返回指向零基的指针之前,要执行3-4函数调用、对上限和长度的一些范围检查,等等。
发布于 2015-10-23 02:28:45
使([]int,0)分配一些内存
是的,它分配了一个片头,但是没有支持数组。如果片头没有转义当前作用域,则可以在堆栈上分配它。
内存效率比零片低
就使用的内存而言,它们是一样的。
是否值得做一次测试以避免无用的分配
通常,与执行内存分配和初始化所需的周期相比,对int进行比较所需的3或4个指令是没有意义的。
https://stackoverflow.com/questions/33299616
复制相似问题