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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容