为提高性能go的slice和数组要什么初始化才好
var buf [64]byte
var t []byte
required := len(s) + 2*hexCount
if lenByte <= len(buf) {
t = buf[:required]
} else {
t = make([]byte, required)
}
// do something
return string(t)
tt:=make([]byte,1000) //优先分配在栈上
len := 64
ss := make([]byte,len) //分配在堆上
真是的吗?//ss := make([]byte,0,len)这样可以减少内存分配吗?
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
slice和map采make创建时,预估大小指定容量 slice和map与数组不一样,不存在固定空间大小,可以根据增加元素来动态扩容。
slice初始会指定一个数组,当对slice进行append等操作时,当容量不够时,会自动扩容:
如果新的大小是当前大小2倍以上,则容量增涨为新的大小; 否而循环以下操作:如果当前容量小于1024,按2倍增加;否则每次按当前容量1/4增涨,直到增涨的容量超过或等新大小。 map的扩容比较复杂,每次扩容会增加到上次容量的2倍。它的结构体中有一个buckets和oldbuckets,用于实现增量扩容:
正常情况下,直接使用buckets,oldbuckets为空; 如果正在扩容,则oldbuckets不为空,buckets是oldbuckets的2倍, 建议:初始化时预估大小指定容量
m := make(map[string]string, 100) s := make([]string, 0, 100) // 注意:对于slice make时,第二个参数是初始大小,第三个参数才是容量