Go 编译器会在结构体字段之间插入填充字节,以满足对齐要求。 当字段排序非最优时,这种填充可能会浪费大量内存,尤其是在大量分配的结构体中(切片、映射、缓存)。
将字段按对齐要求从大到小重新排序可以消除不必要的填充并减少结构体的内存占用。 使用更新结构体布局快速修复可以自动应用最佳字段顺序。
示例:
type Config struct {
Active bool // 1 字节 + 7 字节填充
Value int64 // 8 字节
Flag bool // 1 字节 + 7 字节填充
} // 共计:24 字节,浪费了 14 字节
在这里,由于对齐要求,int64 字段之间的 bool 字段分别会产生 7 字节的填充。 该结构体浪费了 24 字节中的 14 字节 (58%)。
在应用快速修复后:
type Config struct {
Value int64 // 8 字节
Active bool // 1 字节
Flag bool // 1 字节 + 6 字节填充
} // 共计:16 字节,节省了 8 字节
通过将最大的字段放在最前面,两个 bool 字段可共用末尾的一个填充块。 结构体的大小从 24 字节减少到 16 字节 — 减少了 33%。