内存对齐(go)
内存对齐
概念:
内存对齐应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。(貌似C语言是可以允许你干预“内存对齐”的)
原因:
1. 平台(移植性):不是所有的硬件平台都能够访问任意地址上的任意数据
2. 性能原因:访问未对齐的内存,cpu需要做两次内存访问,而对齐的内存只需访问一次
操作系统这样做的原因:拿空间换时间,提高效率。
规则:
1. 每次对齐都找当前成员变量类型的长度: 作为对齐数
2. 对齐数就是其结构体成员中最大的对齐数 (最终大小,也是对齐数的整数倍)
type Part1 struct { A byte // 1 B int32 C int8 } X就是padding,即填补的空间 分析: AXXX|BBBB|CXXX 12字节 对齐数4 type Part1 struct { B int32 A byte // 1 C int8 } 分析: BBBB|ACXX 8字节 对齐数4
空类大小为1个字节:因为要插入一个char类型的指针来标识一个唯一的对象
type Part0 struct { } type Part1 struct { A byte // 1 B int16 } type Part2 struct { A byte B int16 C int8 D int64 E int32 } type Part3 struct { A byte B int32 C int8 D int64 E int32 } func main() { fmt.Printf("part0 size: %d, align: %d\n", unsafe.Sizeof(Part0{}), unsafe.Alignof(Part0{})) 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{})) fmt.Printf("part3 size: %d, align: %d\n", unsafe.Sizeof(Part3{}), unsafe.Alignof(Part3{})) }
part0 size: 0, align: 1 part1 size: 4, align: 2 part2 size: 24, align: 8 part3 size: 32, align: 8