在提供的代码中,两个结构体 A 和 B 具有相同的字段但不同的字段顺序,表现出不同的大小。原因如下:
数据类型的内存对齐要求规定字段的地址必须是特定值的倍数。对于 int64 字段,这个倍数是 8 个字节。
在 struct A 中,第一个字段是 bool,占用 1 个字节。为了在 8 字节边界上对齐后续的 int64 字段,在 a 之后添加 7 字节隐式填充。
在 struct B 中,第一个字段是 int64 类型的 b。由于已经对齐,因此在 a 之后只需要 3 个字节的隐式填充来对齐后面的 int 字段,该字段需要 4 个字节。
由于这种隐式填充, A 为 24 个字节(a 为 1 个字节,b 为 8 个字节,以及 15 个字节的填充)。同时,B 为 16 字节(a 1 字节,填充 3 字节,b 8 字节,c 4 字节)。
结构体 C 已完全声明空,导致大小为 0 字节。根据 Go 语言规范,没有大于零的字段的结构的大小为零。
对于零大小值,该语言允许相同的内存地址可重用于不同的变量。这意味着对于 a := C{},系统实际上没有分配内存。
以上是为什么 Go 中具有相同字段但不同顺序的结构体具有不同的大小?的详细内容。更多信息请关注PHP中文网其他相关文章!