如下情况对象A1大小和A2大小一样,顺序变化大小不会变化
type A1 struct {
a int64
b string
}
type A2 struct {
b string //16字节=指向data的指针8字节+int长度8字节
a int64 //8字节
}
a1:=A1{}
a2:=A2{}
fmt.Println("sizeof a1:",unsafe.Sizeof(a1),"sizeof a2:",unsafe.Sizeof(a2))
//output:
//sizeof a1: 24 sizeof a2: 24
64位的CPU可以每次以64bits(8字节,32位CPU则是4字节)的块传输数据,a、b字段每次传输都能占满这个块。
对象B1、B2顺序不同,大小不同
type B1 struct {
c int8
a int64
b string
d int16
}
type B2 struct {
b string
a int64
c int8
d int16
}
b1:=B1{}
b2:=B2{}
fmt.Println("sizeof b1:",unsafe.Sizeof(b1),"sizeof b2:",unsafe.Sizeof(b2))
//outpot:
//sizeof b1: 40 sizeof b2: 32
原本B1、B2对象大小=1字节+8字节+16字节+2字节=27字节,但是结构体中的各个字段在内存中并不是紧凑排列的,而是按照字节对齐的,所以为了对齐而有填充
实际B1大小:
B1大小=8字节(c不够1块则填充)+8字节+16字节+8字节(d同样填充)=40字节
实际B2大小:
B2大小=16字节+8字节+8字节(c,d字段被放入同一块中)=32字节
参考
*看 Go 中的 struct 如何被优化,还有小插曲
*Go语言结构体中属性的顺序将影响结构体的大小
*Size and alignment guarantees