struct的内存分配
struct的内存是开辟了一段连续的内存空间,以4个字节为基础,超过四个字节的变量,会独占一行。
比如golang中bool类型变量占用1B,uint32占用4B
type Tes struct {
A bool
B uint32
C bool
}
因为,A占用1字节,剩余3字节,而B占用4字节剩余空间不够重新开辟一行空间,剩余0字节空间,则C也需重新开辟一行占用1字节。
所以结构体占用了3个4B空间。
var t Tes
fmt.Println("变量内存:", unsafe.Sizeof(t))
fmt.Println("....................")
fmt.Println("字段A内存:", unsafe.Sizeof(t.A))
fmt.Println("字段A偏移:", unsafe.Offsetof(t.A))
fmt.Println("....................")
fmt.Println("字段B内存:", unsafe.Sizeof(t.B))
fmt.Println("字段B偏移:", unsafe.Offsetof(t.B))
fmt.Println("....................")
fmt.Println("字段C内存:", unsafe.Sizeof(t.C))
fmt.Println("字段C偏移:", unsafe.Offsetof(t.C))
输出
变量内存: 12
....................
字段A内存: 1
字段A偏移: 0
....................
字段B内存: 4
字段B偏移: 4
....................
字段C内存: 1
字段C偏移: 8
优化
置换B与C的位置,让A的剩余空间能够放下C
type Tes struct {
A bool
C bool
B uint32
}
输出:
变量内存: 8
....................
字段A内存: 1
字段A偏移: 0
....................
字段B内存: 4
字段B偏移: 4
....................
字段C内存: 1
字段C偏移: 1