为什么结构内存大小与我的期望不一致?

我初始化了一个结构并计算了内存,这与我的期望不一致。

代码是:

type Man struct {
Name     string
Money    int
Age      int32
}

func main() {

m := Man{Name:"james",Money:1000000,Age:30}

fmt.Println("man size:",unsafe.Sizeof(m))
fmt.Println("name size:",unsafe.Sizeof(m.Name))
fmt.Println("money size:",unsafe.Sizeof(m.Money))
fmt.Println("age size:",unsafe.Sizeof(m.Age))
}

结果是:

man size: 32
name size: 16
money size: 8
age size: 4

我预期的'man'大小是16 + 8 + 4 = 28,但事实是32

期待您的帮助!

tkfkdgody 回答:为什么结构内存大小与我的期望不一致?

Size and alignment guarantees

  

对于数字类型,保证以下大小:

type                                 size in bytes

byte,uint8,int8                     1
uint16,int16                         2
uint32,int32,float32                4
uint64,int64,float64,complex64     8
complex128                           16
  

保证以下最小对齐属性:
  1.对于任何类型的变量x:unsafe.Alignof(x)至少为1。
  2.对于结构类型的变量x:对于x的每个字段f,unsafe.Alignof(x)是所有值unsafe.Alignof(x.f)中的最大值,但至少为1。
  3.对于数组类型的变量x:unsafe.Alignof(x)与数组元素类型的变量的对齐方式相同。
  如果结构或数组类型不包含大小大于零的字段(或元素),则其大小为零。两个不同的零大小变量在内存中可能具有相同的地址。

然后,阅读以下内容:
Memory Layouts
Padding is hard - Dave Cheney

在64位计算机上的解释:

您的类型是struct,其大小取决于基础类型的定义方式。具有相同字段但顺序不同的两个结构可能具有不同的大小。结构的大小通过填充和对齐规则进行相应计数。

Struct alignment

注意:每个彩色框都是一个字节。
尝试here,然后编辑结构,然后按页面顶部的Ask按钮。

,

您可能会发现this sizeof explainer有帮助;我当然有。

对于example in your comment,其字段类型为booluint32booluint32uint8uint32uint8,go使用4字节对齐方式,因为任何单个类型都不比这大。在该示例中,每个1字节字段最终都使用四个字节,因为每个字节仅紧接4字节类型。每个字段最后使用4个字节,总共28个字节。如果重新排列这些字段,以便所有4个1字节字段都位于开头或结尾,则它们都可以打包到单个4字节窗口中,因此整个结构仅占用16个字节。

对于您原始帖子中的示例,go使用8字节对齐,因为struct字段之一至少需要8个字节,因此这些字段分别使用16、8和8个字节,总共32个字节。情况下重新排列字段没有任何好处,因为其中只有一个小于对齐方式。

本文链接:https://www.f2er.com/3120416.html

大家都在问