前言:每个人的人生中,可能都有那样一些话,如暗夜明灯、海上灯塔,给人以温暖和支撑、希望和力量。念起它们的时候,能感到一种被理解的妥帖,会生出一股被激励的能量,然后,我们得以在鼓舞中走得更远。让我们走进结构体
一.结构体
1.1 什么是结构体
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2 结构体的声明
例如用结构体描述一个学生
1.3 特殊的声明
在声明结构体时,可以不完全声明,也就是匿名结构体类型
1.4 结构的自引用
结构的自引用就是自己作为自己的成员变量
但是要注意正确的引用方法
如果这样引用结构体的大小将会是无穷大
所以我们引入指针
这样才能达到自引用的目的
1.5 结构体变量的定义和初始化
1.5.1 结构体变量的定义
1.5.2 结构体变量的初始化
1.5.3 结构体变量的嵌套初始化
1.6 结构体内存对齐
来计算一下结构体的大小
来计算一下结构体的大小如果不了解的话可能会觉得是
6 6 13
为什么最终结果会是这样呢?
这就要掌握首先得掌握结构体的对其原则
1.6.1结构体的对其原则
一.
二.结构体嵌套问题
为什么存在内存对齐?
大部分的参考资料都是如是说的:
- 平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。- 性能原因:
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
结构体的内存对齐是拿空间来换取时间的做法。
1.7 修改默认对齐数
结构在对齐方式不合适的时候,我么可以自己更改默认对齐数。
1.8 结构体传参
结构体传参有两种,传值调用和传址调用
两种方法都是可行的,但是也有区别
函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
因此结构体传参的时候,要传结构体的地址。
二.位段
2.1什么是位段
让我们来思考一下位段A的大小
我们来跟深入的了解一下位段的内存分配
2.2 位段的内存分配
- 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
- 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
- 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
2.3 位段的跨平台问题
- int 位段被当成有符号数还是无符号数是不确定的。
- 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
- 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
- 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。
所以跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。
三.感谢大家支持