引用知乎答主KDF5000的一段话——内存对齐主要遵循下面三个原则:
- 结构体变量的起始地址能够被其最宽的成员大小整除
- 结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
- 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节(其实编译器在编译的时候是可以指定对齐大小的,实际使用的有效对齐其实是取指定大小和自身大小的最小值,一般默认的对齐大小是4。)
举个例子:由于内存对齐,创建结构体的时候变量的书写顺序可能影响到结构体变量的大小
struct{
int a;
char b;
short c;
}A;//sizeof(A) = 3*4 = 12,按照最大的成员int(4字节)对齐
struct{
char b;
short c;
int a;
}B;//sizeof(B) = 8
可以理解成每4字节一个块,给变量分配的时候先看看这个能不能放到已经存在的块里,short是两个字节,char占用了第一个块的一个字节以后第一块还剩下三个字节,所以能放下一个short
内存对齐能够提高操作系统访问的效率,因为它可以以块为单位存取数据,而不需要以字节为单位(这是我理解的部分,网上有博客说有的操作系统不能随机访问任意部位所以需要内存对齐)