具体可以参考b站的幼麟实验室,很硬核
type P struct {
a bool
b int32
c int8
d int64
e byte
}
var p P
fmt.Printf("%v\n", unsafe.Sizeof(p) // 32
成员变量对齐方式为:
min(8, 1) = 1,由于是第一个成员,偏移量为0即可,此时内存占位为:a
min(8, 4) = 4,偏移量为4即可,此时内存占位为:axxx | bbbb
min(8, 1) = 1,偏移量为8即可,此时内存占位为:axxx | bbbb | c
min(8, 8) = 8,内存已经占有9位,大于9且是8的整数倍只有16,此时内存占位为:axxx | bbbb | cxxx | xxxx | dddd | dddd
min(8, 1) = 1,直接加入后一个位置,此时内存占位为:axxx | bbbb | cxxx | xxxx | dddd | dddd | e
结构体整体对齐:
此时结构体占有25个字节,并且max(8, 8) = 8,那么必须要扩展成32个字节才满足对齐要求,
故最终内存占位为:axxx | bbbb | cxxx | xxxx | dddd | dddd | exxx | xxxx
标签:axxx,min,bbbb,占位,dddd,内存,Go,对齐,结构
From: https://www.cnblogs.com/qcy-blog/p/18238365