内存对齐原则:
(1)当前成员变量之前的总容量必须为此变量大小的整倍数。
(2)整个结构体的总容量必须为最大成员变量的整数倍。
也就是说我们在分配内存时(自己的理解):
①首先在给当前成员变量分配内存空间时,应观察之前的内存空间是否为此变量大小的整倍数,其实基本上只要看前边的内存空间放下此变量后,是否会超出四个字节。
②最终放入最后一个变量时,我们要使得总容量为最大成员变量的整数倍,如果不够最大成员的整数倍,我们需要进行补齐。也就是说最大成员的整数倍的大小与当前内存大小最接近的数据即为内存空间大小。
例题:
struct _THUNDER {
int iVersion;
char cTag;
char cAdv;
int iUser;
char cEnd;
} Nowcoder;
int sz = sizeof(Nowcoder);
解析:
内存对齐的规则:
1.第一个成员必须是从0位置开始偏移
2.后面的成员从成员的大小和对齐模数相比取小的整数倍的的地方(对齐模数默认是 8)
3.最后要对结构体整体进行对齐:成员中最大的那一个和对齐模数相比取小的整数倍
这里结构体具体的每个成员所在位置:
int iVersion; 0 ~ 3 因为此时为int型占据四个字节
char cTag; 4 ~ 4 此时char占据一个字节,而前边的字节刚好是当前变量char一个字节的整数倍
char cAdv; 5 ~ 5 此时char占据一个字节,而前边的字节刚好是当前变量char一个字节的整数倍
6-7:为当前补齐的内存
int iUser; 8 ~ 11 此时int占据四个字节,而前边的字节为6个,应当为4个字节的整数倍,所以应补齐8个字节,也就是到7,此时占据0-7,之后当前变量int占据四个字节,8-11。
char cEnd; 12 ~ 12 此时char占据一个字节,而前边的字节刚好是当前变量char一个字节的整数倍。最终占据13个字节,应该为所有成员变量中最大的成员变量的整数倍,也就是4个字节的整数倍,占据16个字节。
13-15:为最终补齐的内存
最后末尾 13 ~ 15 补 3 个字节,一共是 16 个字节。
内存图如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |