字对齐
https://blog.csdn.net/a_struggling_monkey/article/details/89298878?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161473706516780261994272%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=161473706516780261994272&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-1-89298878.pc_v1_rank_blog_v1&utm_term=%E5%AD%97%E5%AF%B9%E9%BD%90%E5%9B%BE%E8%A7%A3
1)第一个成员在与结构体变量偏移量为0的位置处。
2)其他成员变量要对齐到某个数字(对其数)的整数倍的地址处。对其数=编译器默认的一个对齐数与该成员大小的较小者。
1.结构体struct大小计算
2.联合体union大小计算
3.枚举体enum的大小计算
1.结构体struct大小计算
奉行两个规则:
1.结构体中每个成员的偏移量必须是该成员自己所占内存大小 的整数倍,否则,会用空白字节填充。
2.当运用规则1 计算结构体大小完毕后,其结构体大小必须是 该结构体中最大的成员变量 的整数倍,否则会用空白字节填充。
偏移量:结构体某个成员变量的位置 与 结构体首地址的距离
例子:
#include <stdio.h>
struct unknown {
char a;
char b;
int c;
long d;
int e;
};
int main () {
printf("%lu\n", sizeof(struct unknown));
return 0;
}
运用规则1:
1.遇到变量a,其偏移量为0,变量大小为1
2.遇到变量b,其偏移量为0+1=1,变量大小为1
3.遇到变量c,其偏移量为1+1=2,变量大小为4,因为 2 不是 4 的整数倍,所以偏移量填充至4.
4.遇到变量d,其偏移量为4+4=8,变量大小为8。
5.遇到变量e,其偏移量为8+8=16,变量大小为1.
运用规则2:
运用规则1计算的结构体大小为17,又结构体最大的成员变量为8。而17 不是 8的整数倍,所以最终结构体大小为24
2.联合体union大小的计算
奉行的两个规则:
1.联合体大小必须能容纳联合体中最大的成员变量
2.通过规则1 计算出的联合体大小必须是 联合体中占内存大小最大的成员类型 的整数倍
例子:
typedef union u1{
char a[6];
int b;
}U1;
typedef union u2{
int a;
long b;
}U2;
typedef union u3{
char a[6];
char b[5];
}U3;
三个联合体 u1,u2,u3的大小分别是 8,8,6
u1:
根据规则1,最大的成员变量是 a[6],其大小为 6.
根据规则2,最大的成员类型是 int ,其大小为 4。 6不是 4 的整数倍,因此6填充至8,所以其最终大小为 8
u2:
根据规则1,最大的成员变量为 b,其大小为8.
根据规则2,最大的成员类型是 long,其大小为8, 因为 8 是 8 的整数倍,所以 其最终大小为8
u3:
根据规则1,最大的成员变量为 a[6],其大小为6
根据规则2,最大的变量类型为 char,其大小为1,6是1的整数被,所以其最终大小为6
3.枚举体enum 的大小计算
枚举体enum的大小同 int 的大小一样。都为4
————————————————
版权声明:本文为CSDN博主「ZJE_ANDY」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014453898/article/details/79474518

浙公网安备 33010602011771号