结构体(struct)
结构体是一些值的集合,这些值称为成员变量,结构体没个成员可以是不同的类型
- 第一个成员变量在与结构体变量偏移量为0的地址处
- 其他成员变量要对到对齐数的整数倍处,对齐数=编译器默认对齐数与该成员大小的较小值,vs中默认对齐数为8,linux默认对齐数为4
- 结构体大小为最大对齐数的整数倍
- 如果嵌套了结构体,嵌套结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
- 平台原因(移值原因):不是所有平台都能访问任意地址上的任意数据的,某些平台只能在某些地址去某些特定类型的数据,否则抛出硬件异常
- 性能原因:减少访问次数,提高效率,数据结构(尤其是栈)应该尽可能地在自然边界上对齐,原因在于对于未对齐的内存,处理器需要作出两次内存访问,而对齐的的内存访问仅需要一次
位段
- int位段被当成有符号还是无符号数是不确定的
- 位段中最大位的数目不确定(16位最大16,32位最大32,写成27在16位中会出问题)
- 位段中的成员在内存中从左向右分配还是从右向左分配尚未定义
- 当一个结构包含两个位段,第二个位段成员比较大,无法容纳第一个位段剩余是,是舍弃还是利用剩余位不确定
枚举(enum)
枚举就是一一列举,枚举类型也叫枚举常量,{}中的可能取值都是有值的,默认从0开始,依次递增1,在定义时也可以赋初值