我应该相信 "aligncheck" 报告的尺寸吗?
Should I trust the size reported by "aligncheck"
我有一个结构定义如下:
type MyStruct struct {
A [10]byte
B uint64
C uint16
}
并与 binary.Read 一起使用,如下所示
err = binary.Read(r, binary.BigEndian, &mystruct) // mystruct is Mystruct type
我得到了 mystruct
中所有字段的正确值。从 Reader r
中读取的一些以下代码都得到了正确的结果。
但是 aligncheck
端 MyStruct
的大小可能是 24,但目前是 32。但是对于二进制字节读取,它应该占用 20 个字节。
所以我不确定我只是运气好得到了正确的结果,还是 go 工具链的某些部分会将结构打包到适当的大小?
正如 Tim Cooper 在其评论中所述,您正在比较同一数据的两种不同表示形式。 aligncheck
告诉您有多少 space 被结构实例占用内存 (heap/stack),由于 explained at length elsewhere 的原因,它受结构字段对齐和填充的影响。
另一方面,binary.Read
和 .Write
并不试图以边界对齐方式将对象存储在内存中;他们只是在写一个连续的字节流。因此,无论字段的顺序如何,这些都将输出相同大小的结构,并且它将始终是结构的最小大小(因为没有添加填充)。
重新访问二进制文件的源代码后,它获取结构中每个字段的真实长度,然后从r
reader中读取正确数量的数据并分别为每个字段赋值.因此,结构在内存中如何对齐并不重要。
我有一个结构定义如下:
type MyStruct struct {
A [10]byte
B uint64
C uint16
}
并与 binary.Read 一起使用,如下所示
err = binary.Read(r, binary.BigEndian, &mystruct) // mystruct is Mystruct type
我得到了 mystruct
中所有字段的正确值。从 Reader r
中读取的一些以下代码都得到了正确的结果。
但是 aligncheck
端 MyStruct
的大小可能是 24,但目前是 32。但是对于二进制字节读取,它应该占用 20 个字节。
所以我不确定我只是运气好得到了正确的结果,还是 go 工具链的某些部分会将结构打包到适当的大小?
正如 Tim Cooper 在其评论中所述,您正在比较同一数据的两种不同表示形式。 aligncheck
告诉您有多少 space 被结构实例占用内存 (heap/stack),由于 explained at length elsewhere 的原因,它受结构字段对齐和填充的影响。
binary.Read
和 .Write
并不试图以边界对齐方式将对象存储在内存中;他们只是在写一个连续的字节流。因此,无论字段的顺序如何,这些都将输出相同大小的结构,并且它将始终是结构的最小大小(因为没有添加填充)。
重新访问二进制文件的源代码后,它获取结构中每个字段的真实长度,然后从r
reader中读取正确数量的数据并分别为每个字段赋值.因此,结构在内存中如何对齐并不重要。