总结:根据结构体中字段的顺序添加不同的隐式填充,从而影响其大小。
不同的架构需要不同的内存对齐方式地址。例如,在提供的代码中,假设目标架构是386,其中alignof int64是8字节。
在struct A中,由于第一个字段是bool,所以有一个7字节的隐式填充在 A.a 之后,以确保类型为 int64 的 A.b 从 8 字节对齐的地址开始。这个填充是必要的,因为结构体本身是对齐到 8 字节的。
然而,在结构体 B 中,B.a 之后只有 3 字节的隐式填充,因为它后面跟着一个 int 类型的字段(其中有大小为 4 字节)而不是 int64。
Go 规范规定,如果结构体或数组类型不包含大小大于零的字段或元素,则其大小为零。
这意味着不同的零- size 变量在内存中可能具有相同的地址。当前的实现遵循此规则,因此不会为大小为零的类型的值分配内存,包括空的 struct struct{} 和零长度的数组。
例如,在提供的代码中,C 是零大小的结构。因此,不会为 C 的实例分配内存。
以上是为什么 Go 结构中不同的字段顺序会导致大小不同?的详细内容。更多信息请关注PHP中文网其他相关文章!