package main
import (
"fmt"
)
func main(){
s := make([]int, 5)
fmt.Printf("%d %d\n",len(s),cap(s))
s = append(s, 1,2,3)
fmt.Printf("%d %d\n",len(s),cap(s))
}
在32位机器上append之后cap是12,64位机器append之后cap是10,请问这是为啥
更多评论
看了一下源代码,cap<1024的默认情况下,slice扩容是原来容量的翻倍,翻倍后的内存向上补齐到{0, 8, 16, 32, 48, 64, 80, 96, 112, 128,...}大小,GO的GC内内存池好像是按这些大小分配的。
64位时,int的长度为8,所以(5*2)*8=80,刚好落在补齐数组内,所以长度为10
32位是,int的长度为4,所以(5*2)*4=40,需要向上补齐到48,所以长度调整为12*4=48
growslice函数中调用了roundupsize函数,此函数处理内存补齐
growslice源码参见https://github.com/golang/go/blob/master/src/runtime/slice.go
roundupsize源码参见https://github.com/golang/go/blob/master/src/runtime/msize.go
#2