Part1
共占用的大小是多少呢?Part1
这一个结构体的占用内存大小为 1+4+1+8+1 = 15 个字节。相信有的小伙伴是这么算的,看上去也没什么毛病#pragma pack(n)
进行变更,n 就是代指 “对齐系数”。一般来讲,我们常用的平台的系数如下:unsafe.Alignof
来返回相应类型的对齐系数。通过观察输出结果,可得知基本都是 2^n
,最大也不会超过 8。这是因为我手提(64 位)编译器默认对齐系数是 8,因此最大值不会超过这个数#pragma pack(n)
)或当前成员变量类型的长度(unsafe.Sizeof
),取最小值作为当前类型的对齐值。其偏移量必须为对齐值的整数倍#pragma pack(n)
)或结构体的所有成员变量类型中的最大长度,取最大数的最小整数倍作为对齐值#pragma pack(n)
)超过结构体内成员变量的类型最大长度时,默认对齐长度是没有任何意义的2^n
,不是偶数倍。显然不符合对齐的规则Part2
,看看它的内部到底和上一位之间有什么区别,才导致了这样的结果?Part1
和 Part2
的内存布局,你会发现两者有很大的不同。如下:Part1
存在许多 Padding。显然它占据了不少空间,那么 Padding 是怎么出现的呢?