You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中bool类型字段strict呈现两种不同内存大小的技术问询

Go语言中bool字段在不同结构体里内存大小不同的原因

这是Go语言的内存对齐机制导致的结果——bool类型本身的固定大小始终是1字节,差异来自结构体整体为满足对齐规则而额外填充的字节。

先明确内存对齐的核心规则

Go的结构体内存布局需要遵守两个关键规则:

  1. 每个字段的起始地址必须是该字段对齐值的整数倍
  2. 结构体的总大小必须是所有字段中最大对齐值的整数倍(保证结构体数组中每个元素的起始地址都符合对齐要求)

案例1拆解

先列出每个字段的大小和对齐要求:

  • encode [64]byte:大小64字节,对齐值1(byte类型的对齐值为1)
  • decodeMap [256]byte:大小256字节,对齐值1
  • padChar rune:大小4字节(rune等价于int32),对齐值4
  • strict bool:大小1字节,对齐值1

按字段顺序计算内存占用:

  1. encode占64字节,结束地址为63(从0开始计数)
  2. decodeMap接在后面,占256字节,结束地址为63+256=319
  3. padChar需要对齐到4的倍数,319+1=320刚好是4的倍数,从320开始存放,占4字节,结束地址为323
  4. strict接在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:20:27