内存对齐
合理的字段顺序使struct更紧密,更省内存
type T1 struct {
a [2]int8
b int64
c int16
}
type T2 struct {
a [2]int8
c int16
b int64
}
fmt.Printf("arrange fields to reduce size:\n"+
"T1 align: %d, size: %d\n"+
"T2 align: %d, size: %d\n",
unsafe.Alignof(T1{}), unsafe.Sizeof(T1{}),
unsafe.Alignof(T2{}), unsafe.Sizeof(T2{}))
/*
output:
arrange fields to reduce size:
T1 align: 8, size: 24
T2 align: 8, size: 16
*/
/*
以64位系统为例,分析如下:
T1,T2内字段最大的都是int64, 大小为8bytes,对齐按机器字确定,64位下是8bytes,所以将按8bytes对齐
T1.a 大小2bytes,填充6bytes使对齐(后边字段已对齐,所以直接填充)
T1.b 大小8bytes,已对齐
T1.c 大小2bytes,填充6bytes使对齐(后边无字段,所以直接填充)
总大小为 8+8+8=24
T2中将c提前后,a和c总大小4bytes,在填充4bytes使对齐
总大小为 8+8=16
*/零大小字段不要放在最后
内存地址对齐
64位字安全访问保证
参考
最后更新于