如图:我们需要获取的数据存储在1-4字节
// 内存对齐测试 // 类型相应字节大小: // bool 1字节 int32 4字节 int8 1字节 int64 8字节 byte 1字节 func TestAlignment(t *testing.T) { // 首先进行成员对齐: // 1. a 1 字节 偏移量 0 占用 1 内存情况:a // 2. b 4 字节 偏移量 4 占用 4 内存情况:axxxbbbb // 3. c 1 字节 偏移量 8 占用 1 内存情况:axxxbbbbc // 4. d 8 字节 偏移量 16 占用 8 内存情况:axxxbbbbcxxxxxxxdddddddd // 5. e 1 字节 偏移量 24 占用 1 内存情况:axxxbbbbcxxxxxxxdddddddde // 成员对齐以后进行整体对齐: // 当前成员共占用25字节,需要保持对齐系数8的倍数,所以需要对齐到32 // 最终内存对齐情况:axxxbbbbcxxxxxxxddddddddexxxxxxx part1 := struct { a bool b int32 c int8 d int64 e byte }{} // 首先进行成员对齐: // 1. e 1 字节 偏移量 0 占用 1 内存情况:e // 2. c 1 字节 偏移量 1 占用 1 内存情况:ec // 3. a 1 字节 偏移量 2 占用 1 内存情况:eca // 4. b 4 字节 偏移量 4 占用 4 内存情况:ecaxbbbb // 5. d 8 字节 偏移量 8 占用 1 内存情况:ecaxbbbbdddddddd // 成员对齐以后进行整体对齐: // 当前成员共占用16字节,刚好为内存对齐系数8的倍数 // 所以最终内存对齐情况:ecaxbbbbdddddddd part2 := struct { e byte c int8 a bool b int32 d int64 }{} fmt.Printf("part1 size: %d, align: %d\n", unsafe.Sizeof(part1), unsafe.Alignof(part1)) fmt.Printf("part2 size: %d, align: %d\n", unsafe.Sizeof(part2), unsafe.Alignof(part2)) // 成员对齐:Age 占用 4 字节 // 整体对齐:64位内存系数位8 所以最终内存占用 8 字节 part3 := struct { Age int }{} fmt.Printf("part3 size: %d, align: %d\n", unsafe.Sizeof(part3), unsafe.Alignof(part3)) }
https://zhuanlan.zhihu.com/p/53413177