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