美文网首页
golang面试题-结构体字段及类型都一致,顺序不一样大小变化了

golang面试题-结构体字段及类型都一致,顺序不一样大小变化了

作者: yuff | 来源:发表于2023-02-11 14:12 被阅读0次

如下情况对象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

相关文章

网友评论

      本文标题:golang面试题-结构体字段及类型都一致,顺序不一样大小变化了

      本文链接:https://www.haomeiwen.com/subject/suglkdtx.html