为提高性能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 协议》,转载必须注明作者和本文链接
一切皆自学
讨论数量: 1

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时,第二个参数是初始大小,第三个参数才是容量

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!