我的博客搬家啦~欢迎光临~ 月一orange - 博客园 今天没吃橘子
对齐规则
1、对于结构体成员变量:
某个成员的偏移量 = k * min(编译器对齐系数, 该成员类型长度) k >= 1
2、结构体完整大小也必须满足:
min(k * max(编译器对齐系数, 最大成员类型长度)) k >= 1
编译器默认对齐长度和计算机一次处理的的位数有关,32位处理器对齐系数为4,64位对齐系数为8。对齐系数就是编译器默认的对齐长度。
demo
对于这样一个结构体:
type Part1 struct {
a bool
b int32
c int8
d int64
e byte
}
var p Part1
fmt.Printf("%v\n", unsafe.Sizeof(p) // 32
成员变量对齐方式为:
min(8, 1) = 1
,由于是第一个成员,偏移量为0即可,此时内存占位为:amin(8, 4) = 4
,偏移量为4即可,此时内存占位为:axxx | bbbbmin(8, 1) = 1
,偏移量为8即可,此时内存占位为:axxx | bbbb | cmin(8, 8) = 8
,内存已经占有9位,大于9且是8的整数倍只有16,此时内存占位为:axxx | bbbb | cxxx | xxxx | dddd | ddddmin(8, 1) = 1
,直接加入后一个位置,此时内存占位为:axxx | bbbb | cxxx | xxxx | dddd | dddd | e
结构体整体对齐:
此时结构体占有25个字节,并且max(8, 8) = 8
,那么必须要扩展成32个字节才满足对齐要求,故最终内存占位为:axxx | bbbb | cxxx | xxxx | dddd | dddd | exxx | xxxx