首页 >后端开发 >Golang >为什么 Go 中具有相同字段但不同顺序的结构体具有不同的大小?

为什么 Go 中具有相同字段但不同顺序的结构体具有不同的大小?

Linda Hamilton
Linda Hamilton原创
2024-12-26 03:29:08389浏览

Why Do Structs with Identical Fields but Different Orders Have Different Sizes in Go?

具有不同字段顺序的不同结构体大小

在提供的代码中,两个结构体 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中文网其他相关文章!

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