今天小小白又来码代码了,今天又又又学习了许多新东西,就迫不及待来分享来啦;今天的重点是结构体内存对齐!!!
1:总:
2:结构体
举例·:
3: 结构的自引用:
一部分存数据(数据域),一部分存内存(指针域);
4:(先了解一下)链表------
数据结构- 数据在内存中存储的结构
线型数据结构:顺序表,链表
顺序表: 链表:(无序的,但1有能力找到2...把他们都串起来)
树形数据结构:二叉树
5:结构体变量的定义和初始化
结构体嵌套:
打印:
6:结构体内存对齐!!!
现在我们深入讨论一个问题:计算结构体的大小。这也是一个特别热门的考点,首先我们先来看一道题吧;试着算出它的答案。
相信聪明的你已经做出来了,不会的也不要慌张;因为第一次的我也是一脸懵逼;
首先我们画出是s1的内存区域;假设从箭头方向看为起始位置;而一个格子代表一个字节
;这样来看第一个格子相对起始位置的偏移量是0(以字节为单位来算偏移量),记为0,以此类推;接着再来看看从c1,i,c2的存放位置。
在此之前我们要先来了解一下offsetof(宏);它的头文件是#include
用法:
所以c1的偏移量为0,i的偏移量为4(并且i占4个字节);c2的偏移量为8;
总得为9个字节;那为什么最后答案是12呢?不要着急,我们接下来继续看;
结构体的总大小,必须是最大对齐数(每个结构体成员都有一个对齐数,其中最大的对齐数就是最大对齐数)的整数倍;4是它的最大对齐数而9不是4的倍数因而继续往后延生到12是4的倍数;但是红色区域没用都浪费掉了;
我们再来看看s2为什么是8个字节;再用一次offsetof(宏)
偏移量为8;正好是最大偏移量4的倍数;所以最后是8。
所以结构体到底是如何对齐的?
了解结构体内存对齐规则:
1:结构体的第一个成员直接对齐到相对于结构体变量起始位置为0的偏移处;
2:从第二个成员开始,要对齐到某个【对齐数】的整数倍的偏移处;
对齐数:结构体成员自身大小和默认对齐数的较小值;
VS:默认对齐数是8
3:结构体的总大小,必须是最大对齐数(每个结构体成员都有一个对齐数,其中最大的对齐数就是最大对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
想必大家都学会了吧,那我们再来练习一个
解析:
嵌套用法:
解析:总的是32正好是所有最大对齐数8的倍数,所以是32
为什么存在内存对齐?(大部分的参考资料书说的是)
1. 平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2. 性能原因:
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问
7:修改默认对齐数:#pragma pack()
举例:
8.结构体传参
两种方法:
今天就先说到这里吧,下次又见啦!!!