1. 问题
观看以下代码
1 | package main |
1.1 分析
S1
- a字段为
struct{}
,不占内存,0字节 - b字段为
int8
,对齐长度1, 占1字节 - c字段为
int64
,对齐长度8,前两个字段只占用了1字节,所以填充7字节,对齐到八字节位
所以S1占用16字节
- a字段为
S2
- a字段为
int8
,对齐长度1, 占1字节 - b字段为
int64
,对齐长度8,a字段只占用了1字节,所以填充7字节,对齐到八字节位 - a字段为
struct{}
,不占内存,0字节
所以S2占用16字节
- a字段为
真的对吗?,看看输出
1 | unsafe.Sizeof(s1): 16 |
为什么呢?我们看看golang仓库中的这个issue 9401,建议自己看比较好。
机翻一下
那么当0字符字段在结构体最后时,多出的一个结构体对齐长度,是为了防止结构体指针之乡结构体外部,即无效指针。