目录
一、结构体类型的声明
1、结构体
我们在介绍一本书时,会介绍它的作者,类型,背景等等,在介绍自己时会讲自己的姓名,年龄,爱好等等,同样是介绍,我们想要讲的东西是不一样的。同样,c语言提供的内置类型是远远不够的,c语言为了解决这个问题,增加了结构体这种自定义的数据类型,结构的每个成员可以是不同类型的变量。
2、结构体的声明
不完全声明
二、结构体变量的创建和初始化
1、结构体变量
2、初始化
三、结构体成员访问操作符
1、直接访问
通过点操作符(.)访问,点操作符接受两个操作符(结构体变量.成员名)
2、间接访问
ps->age等价于(*ps).age
内存中每个字节都有地址,地址可以唯一标识一个内存单元
四、结构体内存对齐
1、对齐规则
1.结构体的第一个成员对齐到和结构体变量起始位置偽移量为0的地址处
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
(对齐数=编译器默认的一个对齐数 与该成员变量大小的较小值 )
-VS中默认的值为 8
-Linux中gce没有默认对齐数,对齐数就是成员自身的大小
3.结构体总大小为最大对齐数)(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体成员对到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。
例题:
2、为什么
1. 平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2. 性能原因:
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
所以在设计结构体的时候,要让空间小的成员集中在一起。
3、修改默认对齐数
#pragme可以改变编译器的默认对齐数
#pragme pack(1)就是设置默认对齐数为1
#pragme pack()是取消设置的对齐数,还原为默认
五、结构体穿参
结构体传参首选传结构体的地址
原因:函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。