内存对齐规则
- 变量(结构体变量)的起始地址能够被其对齐值整除,结构体变量的对齐值为最宽的成员大小
- 结构体每个成员相对于起始地址的偏移能够被其自身对齐值整除,如果不能则在前一个成员后面补充字节
- 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节
此外还有编译器的默认对齐值,一般默认对齐值为4(结构体的实际对齐值会取结构体对齐值和编译器默认对齐值中较小的那一个)。
内存对齐好的处
- 为了减少使用的内存
- 为了提升数据读取的效率
#includeusing namespace std;struct A{ char c; short a; int i; }; int main(){ A c; cout< <
#includeusing namespace std;struct A{ char c; int i; short a;}; int main(){ A c; cout< <
double类型的数组(double类型为8字节对齐), 其在内存中所处的位置如下
数组的首地址为2,根据原则1数组未对齐。若CPU每次从内存中为8字节整数倍的地址开始读入8字节的数据,则每次从未对齐的数组中读取一个成员都要进行两次读取操作,而从对齐的数组中读取则只需要一次读取操作,数组对齐时读取效率有较大提升