1. 结构
struct XXX{
成员列表
};
struct XXX a ;//声明对象
typedef struct XXX{
成员列表
}xxx;直接声明短名字的方法
一种初始化结构体的方法
2. 结构的大小 - 对齐与补齐
结构体存储是按照上图依次顺序完成的,但有几个要求
- 两个结构体的体积必须一样
- 两个结构体之间必须紧紧相连,不能有间隙。这里我理解不是仅仅局限于结构体,应该是将结构体看作一个整体,整体内部可以有间隙,整体外部与其他数据类型是紧紧相连的。
- 基本数据类型、结构体存储时,当前地址必须是自身长度的倍数,如果自身长度大于4字节则按照4字节计算,如果不满足上述要求则需要补上间隙。
- 对齐:是指结构体内部基本类型之间为了满足第3个要求而采取的处理办法,补上间隙。
- 补齐:是指结构体结束时,如果自身结束地址不能满足第3个要求,则需要在结构体最后补上间隙,使得自身长度为4的倍数。
- 为什么要这样处理:有的编译器是32位系统,每次读取4个字节,如果一个变量横跨两个字节会出现访问效率低或者总线错误。
- 结构体所占用的空间可以通过适当调整结构体内部变量的顺序节省空间。
3. 段位
位段(bitfield)只能每个成员所占的位数,位段的类型一定是unsigned 类型:unsigned char (最多8为),unsigned int (最多32位)
unsigned char ur:1;//这是1位的大小
unsigned char 1位
1k = 1024字节
1字节 = 8位
这边输出时2字节,应该是1.125字节(9/8),但内存分配机制导致最后是2字节。
3. 联合
联合(union)所有成员公用一个空间。
结构是每个成员有各自的地方,各自空间不受影响;联合是多个成员公用一个空间,空间受到影响。
两种声明方式
union IP{
char i4[4];
int net;
};
typedef union IP{
char i4[4];
int net;
} ip;
仔细观察,i4 net的顺序是相反的,这个在不同CPU 系统之间顺序是不同的。