struct
关键字:当我们想定义一个含有多个属性值的变量时,可以使用结构体变量
结构体声明

结构体初始化

结构体的特殊声明:匿名结构体

注意:在声明匿名结构体时一定要定义好结构体变量,不然会报错,且这个结构体只能使用一次
结构体内存对齐
对齐规则:
结构体第一个成员在结构体变量偏移量为0的地址处
其他成员要对齐到这个成员本身的对齐数的整数倍的地址处
对齐数=编译器默认对齐数大小 与 成员本身结构类型大小的较小值
VS默认的对齐数是8
Liunx本身没有对齐数,成员本身大小就是对齐数
c.结构体总大小为成员最大对齐数的整数倍
d.如果结构体中又嵌套了一个结构体,嵌套的结构体大小对齐到其成员最大对齐数的整数倍,结构体大小就是所有成员(含嵌套的结构体大小)最大对齐数的整数倍
例如:



调试代码,在监视框中也能看到成员变量a和c的内存差了4个字节
为什么会存在内存对齐呢?
平台自身原因:
不是所有的硬件都能够访问任意位置的数据,一些硬件只能在某些特定地址处才能访问到数据,否则会抛出硬件异常
性能原因:
如struct{
char c;
int a;
}
在32位机器上,cpu一下访问4个字节


故:结构体内存对齐的本质就是 拿空间换时间!
那我们如何在节省时间的同时又不太浪费空间呢?
让占用空间的成员变量尽量在一起

修改对齐数
#pragma pack(1) 修改对齐数为1


计算结构体偏移量
offsetof:


结构体传参

由于函数传参的时候,参数需要压栈,会有时间和空间上的开销
如果一个结构体过大时,传递参数所需要的时间和空间开销就会变大,导致性能下降
故:结构体传参选择传递结构体的地址值