什么是内存对齐
为保证程序顺利高效运行,编译器会把各种类型的数据安排到合适的地址,并占用合适的长度,就是内存对齐
为什么要进行内存对齐
简而言之,就是要提高性能,减少浪费,用下面的视频来解释更为形象(视频01:55-02:30)
https://www.bilibili.com/video/BV1Ja4y1i7AF?spm_id_from=333.788.top_right_bar_window_history.content.click
内存对齐的规则
1、数据的起始存储地址是其内存对齐边界的倍数。
2、数据的占用字节数是其内存对齐边界的倍数。
以上图为例:
int16可以存储的地址为:
0%2 = 0 //地址0
2%2 = 0 //地址2
4%2 = 0 //地址4
6%2 = 0 //地址6
8%2 = 0 //地址8
10%2 = 0 //地址10
12%2 = 0 //地址12
14%2 = 0 //地址14
int32可以存储的地址为:
0%4 = 0 //地址0
4%4 = 0 //地址4
8%4 = 0 //地址8
12%4 = 0 //地址12
各个数据类型的对齐边界
数据类型的对其边界与平台有关,go语言支持的平台中,32位平台的最大对齐边界(寄存器宽度RegSize)为4,64位平台支持的最大对齐边界为8;而数据类型的对齐边界是取数据类型大小与平台最大对齐边界这两者中较小的值,需要注意的是,同一个类型,在不同平台上的大小可能不同,对齐边界也可能不同,下图是各个数据类型分别在32和64位平台下的对齐边界。
为什么不统一使用平台最大对齐边界,或者统一用各类型大小来对齐呢?
涉及内存地址合理使用的问题,用下面的视频来解释更为形象(视频03:30-04:50)
https://www.bilibili.com/video/BV1Ja4y1i7AF?spm_id_from=333.788.top_right_bar_window_history.content.click
结构体内存对齐
结构体内存对齐规则
对于结构体而言,首先要确定每个成员的对齐边界,然后取其中最大的,这个最大值即为这个结构体的内存对齐边界
结合内存对齐的两条规则,最终结构体T占用的内存大小为24字节。
结构体内存对齐优化
如果将上述结构体改为下面的结构
type P struct {
A int8
B int16
C int32
D int64
}
则这个结构体P最终占用的字节数为16字节。