我应该相信 "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 中读取的一些以下代码都得到了正确的结果。

但是 aligncheckMyStruct 的大小可能是 24,但目前是 32。但是对于二进制字节读取,它应该占用 20 个字节。

所以我不确定我只是运气好得到了正确的结果,还是 go 工具链的某些部分会将结构打包到适当的大小?

正如 Tim Cooper 在其评论中所述,您正在比较同一数据的两种不同表示形式。 aligncheck 告诉您有多少 space 被结构实例占用内存 (heap/stack),由于 explained at length elsewhere 的原因,它受结构字段对齐和填充的影响。

另一方面,

binary.Read.Write 并不试图以边界对齐方式将对象存储在内存中;他们只是在写一个连续的字节流。因此,无论字段的顺序如何,这些都将输出相同大小的结构,并且它将始终是结构的最小大小(因为没有添加填充)。

重新访问二进制文件的源代码后,它获取结构中每个字段的真实长度,然后从r reader中读取正确数量的数据并分别为每个字段赋值.因此,结构在内存中如何对齐并不重要。