在Go语言中,结构体的大小取决于内部属性的类型以及它们的排列顺序。
struct {
a bool
b int32
c string
d string
}
上面这个结构体的大小和下面这个结构体的大小是不同的,尽管它们只是属性的定义顺序不同。
struct {
b int32
c string
d string
a bool
}
为什么会这样?可以把内存想象成是由一个一个固定大小的小盒子组成的。如果结构体的某个属性的大小大于当前盒子剩余的大小,那个这个属性将填入下一个盒子中。这将造成上一个盒子的尾部空间没有被填入数据,但是却占用了内存。这种结构体初始化每个变量实例时都会有这种情况。
这里有一个非常棒的网站(golang-sizeof.tips/),你可以在这个网站上输入一个结构体的定义,然后查看内存布局。我们拿上面第一个结构体来看:
下面是第二个结构体的展示:
感谢这个网站。下次当你有一个非常大的结构体类型的数组时,就可以通过这个网站来估算数组的内存大小了。
英文链接: Preslav Rachev | Reduce Struct Size by Laying out Attributes Accordingly preslav.me/2019/08/27/…