内存对齐(memory alignment)

内存对齐(Memory Alignment)是计算机系统架构和编程中的一个基本概念,它指的是数据在内存中的存储地址必须是某个值的整数倍。这个“某个值”通常是该数据类型的大小或其最大成员的大小(在结构体中)。 通过分析以下具体实例加深内存对齐理解。 type itab struct { inter *interfacetype // 接口类型信息 _type *_type // 实现接口的具体类型信息 hash uint32 // 类型 hash 值 _ [4]byte fun [1]uintptr // 实现接口方法的函数地址 } 一、Go 的结构体内存布局规则 Go 里每个字段在内存中都有一个偏移量(offset),而编译器会自动插入 padding(填充字节),以保证每个字段都按其类型对齐(alignment)。 规则大致是: 每个字段的起始地址必须是该字段类型的对齐倍数。 比如:uint32 对齐要求 4 字节,uintptr(在 64 位机上)对齐要求 8 字节。 整个结构体的大小必须是其内部最大对齐单位的整数倍。 编译器自动插入 padding 字节,但有时源码里会显式加 _ [N]byte 来占位或兼容 ABI。 二、itab 的字段分析(以 64位架构为例) 我们来计算每个字段的内存偏移: 字段 类型 大小 (Size) 自身对齐值 (Align) 偏移量 (Offset)单位:字节 备注 inter *interfacetype 8 字节 8 字节 0 → 8 8 字节对齐 _type *_type 8 字节 8 字节 8→16 8 是 8 的倍数,已对齐 hash uint32 4 字节 4 字节 16→20 16 是 4 的倍数,已对齐 _ [4]byte 4 字节 1 字节 20→24 4 字节的填充 (Padding) fun [1]uintptr 8 字节 8 字节 24→32 8 字节对齐 24 是 8 的倍数 总大小32 字节,结构体最大对齐是 8 字节,总大小 32 是 8 的倍数。 ...

2025年9月5日 · Mumu