首页 >后端开发 >Golang >为什么 Go 结构中不同的字段顺序会导致大小不同?

为什么 Go 结构中不同的字段顺序会导致大小不同?

Susan Sarandon
Susan Sarandon原创
2024-12-05 01:36:10468浏览

Why Do Different Field Orders in Go Structs Result in Varying Sizes?

如果字段顺序不同,结构体的大小也不同

1.结构体大小

总结:根据结构体中字段的顺序添加不同的隐式填充,从而影响其大小。

不同的架构需要不同的内存对齐方式地址。例如,在提供的代码中,假设目标架构是386,其中alignof int64是8字节。

在struct A中,由于第一个字段是bool,所以有一个7字节的隐式填充在 A.a 之后,以确保类型为 int64 的 A.b 从 8 字节对齐的地址开始。这个填充是必要的,因为结构体本身是对齐到 8 字节的。

然而,在结构体 B 中,B.a 之后只有 3 字节的隐式填充,因为它后面跟着一个 int 类型的字段(其中有大小为 4 字节)而不是 int64。

2。零大小值

Go 规范规定,如果结构体或数组类型不包含大小大于零的字段或元素,则其大小为零。

这意味着不同的零- size 变量在内存中可能具有相同的地址。当前的实现遵循此规则,因此不会为大小为零的类型的值分配内存,包括空的 struct struct{} 和零长度的数组。

例如,在提供的代码中,C 是零大小的结构。因此,不会为 C 的实例分配内存。

以上是为什么 Go 结构中不同的字段顺序会导致大小不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn