我应该相信“aligncheck”报告的大小吗?

时间:2017-08-18 11:02:11

标签: go memory-alignment

我有一个如下定义的结构:

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工具链的某些部分会将结构打包到合适的大小?

2 个答案:

答案 0 :(得分:3)

正如Tim Cooper在评论中所述,您正在比较相同数据的两种不同表示。 aligncheck告诉您结构实例占用的内存(堆/堆栈)占用了多少空间,受结构字段对齐和填充的影响,原因为explained at length elsewhere

另一方面,

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

答案 1 :(得分:1)

重新访问二进制文件的源代码后,它获取结构的每个字段的实际长度,然后从r阅读器读取正确的数据量,并分别将值分配给每个字段。因此,结构在内存中的对齐方式并不重要。