Byte 字节 bit 位
1 字节(Byte) = 8 位(bit) 1 字长 = 64位 (bit)
CPU访问内存是按照一个字长为单位进行访问
为什么2个结构体的大小相同? 一个字节等于8位
非内存对齐:内存的原子性和效率会受到影响。
内存对齐,提高内存操作效率,有利于内存原子性
Go语言底层内存对齐的原理, 对齐系数
为方便内存对齐,Go语言提供了对齐系数 unsafe.Alignof()
对齐系数的含义是: 变量的内存地址必须被对齐系数整除
如果对齐系数为4,表示变量内存地址必须是4的倍速
结构体对齐
结构体对齐分为内部对齐和结构体之间对齐
内部对齐:考虑成员大小和成员的对齐系数
结构体长度填充:考虑自身对齐系数和系统字长
结构体内部对齐
指的是结构体内部成员的相对位置(偏移量)
每个成员的偏移量是自身大小与对齐系数较小值的倍速
结构体长度填充
指的是结构体通过增加长度,对齐系统字长 结构体长度是 最大成员长度 与 系统字长 较小值的整数倍
结构体对齐系数
为什么string的对齐系数是8? 刚才Demo结构体,对齐系数是多少? 结构体的对齐系数是其成员的最大对齐系数
空结构体的对齐
空结构体单独出现时,地址为zerobase 空结构体出现在结构体中时,地址跟随前一个变量 空结构体出现在结构体末尾时,需要补齐字长
总结
提高内存操作效率,变量之间需要内存对齐 基本类型考虑对齐系数 结构体既需要内部对齐,又需要外部对齐 空结构体作为最后一个成员,需要填充对齐