我正在研究 Go,它看起来很有前途。
我想弄清楚如何获取 go 结构的大小,例如
例如
type Coord3d struct {
X, Y, Z int64
}
我当然知道它是 24 个字节,但我想以编程方式知道它..
您有任何想法如何做到这一点吗?
罗杰已经展示了如何使用SizeOf https://golang.org/pkg/unsafe/#Sizeof方法从unsafe https://golang.org/pkg/unsafe包裹。请确保在依赖函数返回的值之前阅读此内容:
该大小不包括 x 可能引用的任何内存。为了
例如,如果 x 是切片,则 Sizeof 返回切片的大小
描述符,而不是切片引用的内存的大小。
除此之外,我想解释如何使用几个简单的规则轻松计算任何结构的大小。然后如何使用有用的方法来验证您的直觉service http://golang-sizeof.tips/.
大小取决于它包含的类型以及结构中字段的顺序(因为将使用不同的填充)。这意味着具有相同字段的两个结构可以具有不同的大小。
例如这个结构体将有一个尺寸为32
struct {
a bool
b string
c bool
}
稍加修改就会有尺寸为 24 (a 25%差异只是由于字段排序更紧凑)
struct {
a bool
c bool
b string
}
正如您从图片中看到的,在第二个示例中,我们删除了其中一个填充并移动了一个字段以利用之前的填充。对齐可以是 1、2、4 或 8。填充是用于填充变量以填充对齐的空间(基本上是浪费的空间)。
了解这条规则并记住:
- bool、int8/uint8 占用 1 个字节
- int16、uint16 - 2 字节
- int32、uint32、float32 - 4 字节
- int64、uint64、float64、指针 - 8 字节
- 字符串 - 16 字节(2 个 8 字节对齐)
- 任何切片占用 24 个字节(3 个 8 字节对齐)。所以
[]bool
, [][][]string
是相同的(不要忘记重新阅读我在开头添加的引文)
- 长度数组
n
takes n
* 类型需要字节数。
有了填充、对齐和字节大小的知识,您可以快速找出如何改进您的结构(但仍然有意义)使用该服务验证您的直觉 http://golang-sizeof.tips/).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)