结构体是将一个对象的许多属性放在一起进行管理,他和类比较相似,不过类除了将一个对象的属性放在一起外,还可以将这个对象的行为放在一起。举个例子来说,我们可以定义一个人的结构体,然后将人的姓名,年龄,身高等特性放在这个结构体中,而后我们就可以根据不同的人来创建不同的结构体对象,然后对不同的结构体对象赋予自己的属性,你能很清晰的看出这个人的所有属性,而如果我们除了要了解这个人的一些静态属性以外,还要把他的一些行为也归纳到一起的话,我们使用结构体就不能解决,这是我们就需要创建人的类,除了定义一些属性之外,还可以定义人的一些行为函数,如吃饭,睡觉,上学等,如果每个人的行为实现方式相似,那么就可以将其实现放在类中,如果不同的人对于同一个行为有不同的实现,那么我们就可以将行为函数定义为虚函数,利用类的多态性来实现。而枚举是将同一属性的不同值尽可能的给出,比如为颜色创建一个枚举,里面分别赋予红色、黄色、蓝色等不同的值,以后使用的时候就可直接使用枚举中列出来的值。
结构体的存储遵循:
1.第一个成员在与结构体变量的偏移量为0的地址处
2.其他成员要对齐到编译器默认对齐数与该成员大小的较小值的整数倍
3.结构体的总大小为最大对齐数的整数倍
4.如果嵌套了结构体的情况,嵌套结构体对齐到自己最大对齐数的整数倍。
如上面的例子中,结构体s3,double占8个字节,char占一个字节,而后的int占4个字节,由于32位计算机读取的时候一次大概读取四个字节,为了能取一个变量的值的时候尽可能少的访问内存,因此应尽可能讲一个变量的值放在同一个读取块中,因此char c对齐为4个字节,int i紧随其后,这样才不会出现在取i的时候要先取前3个字节,然后再取后一个字节的情况,而为了对齐到最大对齐数的整数倍,因此在存放完char e之后,还要在填充3个字节讲结构体大小变为8个字节的整数倍,因此结构体s3大小为24。而对于结构体s4,其中包含了结构体s3,根据第四条规则,嵌套的结构体要对齐到自己最大对齐数8的整数倍,因此s3的大小为24,char c1对齐到8,double大小为8,因此s4的大小为40。(s4的理解可能不到位,有错,希望有大佬可以帮忙改正,谢谢)。记录自己的学习过程,有很多不对的地方,见谅。😁