为保证程序顺利高效的运行,编译器会把各种类型的数据安排到合适的地址并占用合适的长度,这就是内存对齐
每种类型的对齐值就是他的内存边界
64位
类型 | 对齐边界 (对齐值) |
---|---|
int8 | 1byte |
int16 | 2byte |
int32 | 4byte |
int64 | 8byte |
string | 8byte |
32位
类型 | 对齐边界(对齐值) |
---|---|
int8 | 1byte |
int16 | 2byte |
int32 | 4byte |
int64 | 4byte |
string | 4byte |
内存对齐要求数据存储地址以及占用的的字节数都要是他对齐边界的倍数,如
type demo struct { a int16 b int32 }
如果将0作为起始地址,a占用2字节长度,之后b要对齐到4而不能紧接着a在2开始
结构体的大小要是最大对齐值的整数倍,例如
type demo struct { a int16 b int32 } func main(){ demo:=demo{} fmt.Println(unsafe.Sizeof(demo)) }
按上面分析,大小应该为6,但实际上
demo size is : 8
详细了解,点击这里
https://www.bilibili.com/video/BV1Ja4y1i7AF