结构体:
struct unknown {
int a;
char b;
int c;
long d;
char e;
};
printf("%lu\n", sizeof(struct unknown)); //output : 32
1、遇到第一个成员变量a,该成员偏移量为0,大小为4,符合偏移规则第一条。
2、接下来第二个成员变量b,偏移量为4,大小为1,符合偏移规则第一条。
3、成员变量c,偏移量为5,大小为4,不符合偏移规则第一条。在成员b和c之间填充三个字节,此时,偏移量大小为8,符合偏移规则第一条,继续往下。
4、成员变量d,偏移量为12,大小为8,不符合偏移规则第一条,在成员c和d之间填充4个字节,此时偏移量为16,符合偏移规则第一条,继续往下。
5、成员变量e,偏移量为24,大小为1,符合偏移规则第一条。
6、所有成员大小计算完后,执行偏移规则第二条,最宽的类型是d,long类型,8个字节,当前结构体计算出的大小为25,并不符合第二条规则,于是在末尾填充7个字节,总大小为32个字节,满足第二条偏移规则。到此结构体大小计算结束。
Union:
union共用体变量大小等于共用体结构中占用内存最大的成员的内存大小。
enum枚举:
枚举类型,指一个被命名的整型常数的集合。即枚举类型,本质上是一组常数的集合体,只是这些常数有各自的命名。枚举类型,是一种用户自定义数据类型。
枚举变量,由枚举类型定义的变量。枚举变量的大小,即枚举类型所占内存的大小。由于枚举变量的赋值,一次只能存放枚举结构中的某个常数。所以枚举变量的大小,实质是常数所占内存空间的大小(常数为int类型,当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节),枚举类型所占内存大小也是这样。