
1.1结构体的基本知识结构是一些值的集合这些值叫做成员变量结构的每个成员可以是不同类型的变量1.2结构体的声明这里的s1,s2是结构体变量这里的Stu是用typedef重新定义的类型1.3特殊的声明在声明结构的时候可以不完全声明比如1.4结构体的自引用1.5结构体的定义和初始化也可以乱序初始化1.6结构体内存对齐1结构体的第一个成员对齐结构体在内存中存储位置的偏移量为0的地方2从第二个成员开始每个成员都要对齐到一个对齐数的整数倍处对齐数把默认对齐数和成员的字节大小对比较小的那个数VS默认是8Linux和gcc没有默认对齐数对齐数是成员自身的大小3结构体的总大小必须为成员对齐数中最大的那个对齐数的整数倍包含嵌套结构体成员中的对齐数。offsetof用来计算成员相较结构体起始位置的偏移量的4结构体中若有嵌套了结构体成员要将嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处为什么要内存对齐1平台原因不是所有的硬件平台都能访问任意地址上的数据某些硬件平台只能在某些地址处取某些特定类型的数据否则抛出硬件异常2性能原因数据结构尤其是栈应该尽可能的在自然边界上对齐。原因在于为了访问未对其的内存处理器需要做2次访问而对齐的内存只需要做一次访问。设计结构体的时候尽量让占用空间小的成员集中在一起以节省空间1.7修改默认对齐数可以用#pragma pack1.8结构体传参上面传参的方式第二种更好一些因为函数传参的时候参数需要压栈会有时间和空间上的开销。如果传递一个结构体对象的时候结构体过大参数压栈的系统开销比较大所以会导致性能下降。2.1位段位段的声明和结构体是类似的有两个不同1.位段成员必须是intunsigned intsigned int。char也行char也属于整型家族2.位段的成员后面有一个冒号加一个数字大小不能超过它的类型的大小A就是一个位段类型位段成员后面的数字表示占多少个2进制位。它的功能和结构体一样只不过它可以更节省空间2.2位段的内存分配1.位段的成员可以是int,unsiged int,signed int或者是char类型2.位段的空间上是需要以4个字节int或1个字节char的方式来开辟的3位段涉及很多不确定因素位段是不跨平台的注意可移植程序应避免使用位段2.3位段的跨平台问题int位段被当成有符号数还是无符号数是不确定的位段中的最大数目不能确定。16位机器最大1632位最大32写成27.在16位机器会出问题位段的成员在内存中从左向右分配还是从右向左分配标准尚未规定当一个结构包含2个位段第二个位段成员比较大无法容纳第一个位段剩余的位时是否舍弃剩余位还是利用这是不确定的。3.1枚举类型的定义以上的enum Day就是枚举类型{}中的内容是枚举类型的可能取值也叫枚举常量。这些可能取值都是有值的默认从0开始一次递增1当然在定义的时候也可以赋值如下用枚举常量给枚举变量赋值3.2枚举的优点我们可以使用#define来定义常量为什么要用枚举增加代码的可读性和可维护性和#define定义的标识符比较枚举有类型检查更加严谨防止命名污染封装 同类型的常量放在一起便于调试 可以在监视窗口观察使用方便一次可以定义多个常量4联合共用体4.1联合类型的定义联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员 特征是这些成员公用同一块空间所以联合也叫共用体联合里的2个变量不能同时使用4.2联合体的特点联合的成员是共用同一块空间的这样一个联合变量的大小至少是最大成员的大小因为联合得有能力保存最大的那个成员4.3联合体大小的计算联合的大小至少是最大成员的大小当最大成员的大小不是最大对齐数的整数倍的时候就要对齐到最大对齐数的整数倍。