直接回答:CPU 按字长访问内存,编译器要求字段偏移量是其对齐系数的整数倍,不满足就插入填充字节;结构体整体还要对齐到最大字段对齐系数的倍数。同样字段换顺序,大小可能不同:
type A struct { // 24 字节
b bool // 1 + 7 padding
i int64 // 8
c bool // 1 + 7 padding
}
// B 把 int64 放最前、两个 bool 相邻,只占 16 字节
展开解析:对齐系数用 unsafe.Alignof 查:int64/指针是 8,int32 是 4,bool 是 1。字段从大到小排通常接近最优,但不必手工纠结——go vet 的 fieldalignment analyzer 会给出最优顺序。两个真正重要的场景:一是旧式 atomic API 要求 64 位操作数 8 字节对齐,32 位平台不对齐会 panic,Go 1.19 的 atomic.Int64 等类型从根上解决;二是百万级实例的对象数组,每实例省 8 字节就是省几 MB 堆内存并降低 GC 扫描压力。unsafe.Sizeof、unsafe.Offsetof 可验证布局。
追问方向:struct{} 占多少字节、有什么用?什么是缓存行伪共享?(约 586 字)