什么是内存对齐
内存对齐是一种在计算机内存中排列数据、访问数据的一种方式。
它包含基本数据对齐和结构体数据对齐 。
内存对齐规则
数据成员对齐规则:首个数据成员是在偏移为 0 的地方开始,后面每个数据成员地址为其自身大小的整数倍。
如果结构体的数据成员中有结构体,计算成员最大长度时是以这个结构体成员中的最大元素的大小来计算的。
结构体的整体对齐规则:在数据成员按照规则第一条完成各自对齐之后,结构体本身也要进行对齐。对齐会以结构体的成员最大长度的整数倍来处理的。
基本数据类型占据内存大小
实际例子
struct lqStructOne {
int a; //4字节
short b;//2字节
char c;//1字节
double d;//8字节
}lqStructM;
struct lqStructTwo {
char c;//1字节
double d;//8字节
int a; //4字节
short b;//2字节
}lqStructN;
struct lqStructThree {
char a;//1字节
int b; //4字节
short c;//2字节
struct lqStructOne m;
}lqStructT;
使用sizeof打印其占用内存结构
lqStructM:16---lqStructN:24--lqStructT:24
两个结构体区别在于成员的顺序不同,即导致了占用内存的不同。分析其:
lqStructM中:
- a的占4个字节,此时min(0,4),这是首位从0开始,即 0-1-2-3 存储 a。
- b的占2个字节,此时min(offset,2),最近的位置为4,即 4-5 存储 b。
- c的占1个字节,此时min(offset,1),最近的位置为6,即 6 存储 c。
- d的占8个字节, 此时min(offset,8),最近的位置为8,即 8-9-10-11-12-13-14-15 存储 d。
lqStructN中: - c的1个字节,此时min(0,1),这是首位从0开始,即 0-1 存储 c。
- d的占8个字节,此时min(offset,8),最近的位置为8,即 8-9-10-11-12-13-14-15 存储 d。
- a的占4个字节,此时min(offset,4),最近的位置为16,即 16-17-18-19存储 a。
- b的占2个字节, 此时min(offset,2),最近的位置为20,即 20-21存储 b.
lqStructT中: - a的占1个字节,此时min(0,1),这是首位从0开始,即 0-1-2-3 存储 a。
- b的占4个字节,此时min(offset,4),最近的位置为4,即 4-5-6-7 存储 b。
- c的占2个字节,此时min(offset,2),最近的位置为8,即 8-9存储 c。
- m为结构体,其内存最大元素大小为8, 此时min(offset,8),最近的位置为16,即 16至31共16字节存储 m.