Go语言中bool类型字段strict呈现两种不同内存大小的技术问询
Go语言中bool字段在不同结构体里内存大小不同的原因
这是Go语言的内存对齐机制导致的结果——bool类型本身的固定大小始终是1字节,差异来自结构体整体为满足对齐规则而额外填充的字节。
先明确内存对齐的核心规则
Go的结构体内存布局需要遵守两个关键规则:
- 每个字段的起始地址必须是该字段对齐值的整数倍
- 结构体的总大小必须是所有字段中最大对齐值的整数倍(保证结构体数组中每个元素的起始地址都符合对齐要求)
案例1拆解
先列出每个字段的大小和对齐要求:
encode [64]byte:大小64字节,对齐值1(byte类型的对齐值为1)decodeMap [256]byte:大小256字节,对齐值1padChar rune:大小4字节(rune等价于int32),对齐值4strict bool:大小1字节,对齐值1
按字段顺序计算内存占用:
encode占64字节,结束地址为63(从0开始计数)decodeMap接在后面,占256字节,结束地址为63+256=319padChar需要对齐到4的倍数,319+1=320刚好是4的倍数,从320开始存放,占4字节,结束地址为323strict接在324位置,占1字节,此时已用总大小为324+1=325字节
但结构体的最大对齐值是rune的4字节,总大小必须是4的整数倍。325除以4余1,因此需要额外填充3字节,最终总大小为325+3=328字节,和输出结果一致。
案例2拆解
结构体仅包含strict bool一个字段:
- 字段大小1字节,对齐值1
- 结构体的最大对齐值也是1,总大小直接等于字段大小1字节,符合输出结果
内容的提问来源于stack exchange,提问作者Kartik Chauhan
相关产品推荐
相关产品推荐

