结构体对齐和枚举类型
作者:互联网
一.
自定义扩展类型:enum(枚举)struct(结构体)union(联合/共用)
1.枚举:增加代码的可读性
在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等。此时可以使用枚举类型来增加代码的可读性。
例如,列出一个星期有几天:
- enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues ...... Sun 对应的值分别为 0、1 ...... 6。
我们也可以给每个名字都指定一个值:
2.enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
更为简单的方法是只给第一个名字指定值:
3.enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
这样枚举值就从 1 开始递增,跟上面的写法是等效的。
4.可以用typedef来简化:typedef enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
day aa; //创建一个枚举类型的变量
aa=Mon;
二.
结构体的内存对齐的问题:
对于结构体的内存计算并不是直接将每个成员变量所占字节数直接相加,而是要保证一定的对齐规则。
如:
struct Test
{
double c; //8
int a; //4
char b; //1
} test;
输出为:8+8=16而不是8+4+1=13。
相加的时候必须保证前面的成员变量的内存所占内存必须是下一个成员变量所占内存的整倍数,如果不够就补上;并且最后的结果必须要是所占内存空间最大的成员变量的整倍数。也就是说要以double所占字节数8为基准进行补齐。
struct Test
{
int a; //4
double c; //8
char b; //1
} test;
输出为:8+8+8=24
对于有数组的情况则以单个单元的字节数为基准而不是全部数组的字节数
struct a
{
char c[10]; //1
char b; //1
};
输出为:11
而对于成员中有指针变量。对于32为操作系统指针占4个字节而64位占8个字节。
标签:week,Sun,enum,Tues,枚举,Mon,类型,对齐 来源: https://blog.csdn.net/apple_51801179/article/details/122178009