- 结构体
- 结构体声明
-
- 匿名结构体(只能使用一次,即只能在一开始的时候创建结构体变量)
对匿名结构体不能使用类型重命名即(typedef)例如:下图代码是错误的
-
- 结构体的自引用
-
- 结构体内存对齐
s1大小为12字节,s2大小为8字节
结构体的大小(首成员直接存入0偏移量处)先是比较成员的大小与编译器默认对齐数的大小,取较小值为对齐数,将该成员存入为对齐数倍数的偏移量处,最后结构体大小为最大对齐数(每个成员对齐数中的最大值)的倍数.
例如s1:c1直接存入0偏移量处,int大小为4vs默认偏移量为8所以取4为对齐数4-7处存入i,同理c2偏移量为1直接存入8偏移量处,现在一个使用了9字节大小,最后由于最大偏移量为4所以该结构体大小为12.
结构体内嵌一个结构体类型成员
s4的大小为32字节
c1存入0处,c3内的最大对齐数为8,所以从8处开始存入s3(8-23),d对齐数为8,d存入24-31,整个结构体的最大对齐数为8(含内嵌结构体成员的对齐数),32为8的倍数所以s4大小为32.
offset - 宏
为什么存在内存对齐
修改默认对齐数上面是设置默认对齐数下面是取消设置的默认对齐数(默认对齐数不能设置为0这样的写法是错误的)
-
- 位段(char也行)
位段根据成员类型开辟需要的空间(如int类型开辟4字节为一个空间,char类型开辟一个字节)开始分配如果本空间无法放下该成员跳到下一个空间继续分配,空间分配规则为先分配低地址再分配高地址.
- 枚举
枚举有类型检查(c++环境下)
联合体的使用例如:(判断大小端)由于使用同一个空间所以可以使用其中的成员来访问其他的成员的内容.
联合体的大小先看联合体成员需要的最大内存大小,然后看内存大小是否为最大对齐数的倍数.例如下图