结构体
结构体的访问形式
- 定义的结构体指针->结构体成员
- 定义的结构体名称.结构体成员
结构体的内存对齐原则
- offsetof 可以测量结构体成员的偏移量,格式:
逗号前是结构体名称,逗号后是结构体成员
- 结构体的对齐的内存对齐原则
注意:对齐数取 默认对齐数 和 该成员占用大小的较小值:gcc 编译器无默认对齐数
- 也可以修改默认对齐数使用#pragma()
- 例题:
在这里 s3 占用字节大小为 8+4+4=16;s4 占用字节为 8+16+8=32
- 结构体内存对齐的原因:主要是为了提高内存访问效率。为了理解:先要明白,计算机 32 (64) 位机的含义,他可以指指针的二进制位数是 32(64)位,他也指计算机内存一次性读取的二进制数据位数。所以再来理解这个结构体对齐与不对齐的区别
内存不对齐时,需要读取两次才能完整读取到整型 i 的内容,而内存对齐时,可以一次性读取。
- 为了节省空间:可以把占用内存小的变量都集中定义在结构体的一个位置。
拾遗
- 结构体最好使用传址调用,因为传值可能由于结构体内存过大导致程序效率降低,只是可能会导致结构体内容在函数中被修改,不安全。
- 结构体可以实现位端但由于其跨平台问题较多,这里不进行讲解只留下例子
枚举类型
- 枚举类型是一种常量
- 枚举的定义形式
注意,枚举常量之间使用逗号隔开,其中默认从上到下每个常量的数值为0,1,2,3,4…;实际上枚举常量都是占四个字节的int常量(vs2022中)
- 可以给枚举常量在定义时进行赋值,若有部分不进行赋值,从该元素的下一元素开始每一个都会比上一个多1;不能在定义枚举的其他地方对枚举变量进行赋值,因为枚举常量实际上就是一个常用的整型使用了一个可读性强的名字
- 类似于最简单的#define,只是把定义的内容都放在了一起。主要作用在于提高代码的可读性。
联合体(共用体)
- 联合体最大的特点是其中的成员共用同一块空间,因此改变任意一个成员都有可能造成其他成员的改变。
- 一个巧妙的判断大小端的设计