当我们写代码的时候,会用到很多变量,如果随意的定义变量,比如写了n多个“unsigned char/int x;”那么代码可能会显的很乱,自己拐回头看的时候都晕掉了,那么这个时候我们可以构造一个复杂的数据类型-结构体类型,对代码中出现的变量进行类别的划分,用构造的结构体类型定义结构体变量,在写or看代码的时候,只要看到这个结构体,就能大致的知道其实现功能,这样看起来就神清气爽了,可读性大大提高。
我们定义的结构体变量,如果没有特殊规定的话是存储在ram中的,单片机的ram资源是有限的,那这个结构体变量在ram中占的空间大小就是我们需要关注一个问题了,它真的像你想的那么“单纯”吗?接下来我们一起来看看吧!
在看下面的图之前,我们说一个前提,在stm32单片机这个32位系统中,signed/unsigned int 占4个字节,signed/unsigned short int 占2个字节 signed/unsigned char 占1个字节,我们称这些为基本数据类型。size = sizeof(test);这个函数是求取这个结构体变量test所占内存的大小,并返回给size。
图1
图2
请看上图,我们使用基本数据类型构造了3个复杂的结构体数据类型,仔细看会发现,这3个数据类型的成员可是不大一样的,我们来看第一个test,这个数据类型总共占4+4=8个字节,这个很好理解,那第二个test1,占空间大小按道理来说应该是1+4 = 5个字节,但是为什么还是8呢,第三个test2,占空间大小应该是1+1+4=8,为什么还是8呢?
这个里面就涉及到了结构体对齐,所有的成员在分配内存时都要与所有成员中占内存最多的基本数据类型所占内存空间的字节数对齐。假如这个字节数为n,那么对齐的原则是:理论上所有成员在分配内存时都是紧接在前一个变量后面依次填充的,但是如果是“以 n 对齐”为原则,那么,如果一行中剩下的空间不足以填充某成员变量时,即剩下的空间小于某成员变量的数据类型所占的字节数,该成员变量在分配内存时另起一行分配。如图3,4:
图3
图4
图5
通过上面的实际测试,我们得出,在构造结构体复杂数据类型的时候,成员变量的排放一定要注意顺序,遵守排放原则,否则就会白白浪费你的空间,掌握好排放原理,能大大提高你的空间利用率。比如我们构造如图5的结构体类型,它依然还是占8个字节。
文末再给大家出个问题,大家看看下面我们构造的数据类型,它们分别占的空间是多大呢?
图6
3D IC半导体设计的可靠性挑战
大数据时代 个人信息安全防护十分重要
苹果12英寸MacBook高清拆解图集
AT32F435/437时钟配置指南
AEC-Q102解读(一)——什么是AEC-Q102?
单片机RAM真的像你想的那么“单纯”吗
工业4.0 大数据崛起重塑商业社会?
三款过CE/FCC/SRCC认证的USB接口双频WIFI模块
IoT工程师如何为你的设计选择正确的软件架构
2016年蓝牙技术将实现更长通信距离、更快传输速度及Mesh联网功能
什么原因会造成伺服编码器损坏?
TensorFlow Lite 构建的无人驾驶微型汽车
蓝光产品承压 晶电欲提高四元产品比重
开启智能时代:亚马逊云科技倾力打造大语言模型前沿应用
未来汽车安全架构对分布式安全加速的需求
PMOS开关电路分析
TDK技术专家:温度传感器于混合动力/电动汽车何其重要
160160液晶屏+MSP430F169程序和电路图
共模电感的阻抗要如何选择
分享几款最良心的入门级千元机