在声明变量后,编译时会根据变量类型给变量分配不同的地址空间,具体变量的地址及分配规则我们不做过多描述,这里关注两个细节问题:1.变量声明顺序不同会不会影响代码空间大小。2.如果空间受到影响在使用变量地址取值时会不会出现问题。当变量不是结构体或联合体时,其实影响不是非常明显,但我们也进行了验证,结构体和联合体的问题我们下篇再说。
在程序编译后,受影响的储存空间有两种,一是FLASH里的存储空间,二是为变量分配运行程序时使用的RAM空间。
RO-data和RW-data存在flash中,上电先加载在RAM中,ZI-data(初值为0的变量和无初值的变量)不用存在flash中,上电直接加载在RAM中,在FLASH上存储规则与在RAM中开辟空间的原则应该没有太大区别,这里统一以在RAM中开辟空间的规则说明。我们先看关于空间分配的两个传言。
传言1:在32位MCU中,即使声明一个uint8_t,编译器最终也会分配四字节空间给这个变量,因此我们在程序中声明uint8_t并不会节约空间,因此尽情的申请uint32_t吧。
传言2:由于变量字节对齐的原因,如果声明两个变量,顺序为:
uint8_t test_u8;
uint32_t test_u32;
则变量将会占八个字节,如果声明顺序为:
uint32_t test_u32;
uint8_t test_u8;
则只会占用5个字节,因此在声明变量时多考虑一下顺序问题可以节省储存空间。
这两个传言互相矛盾,但实际上两个传言都不正确。
首先我们看传言2中的第一个声明ÿ
变量声明顺序对代码空间的影响
最新推荐文章于 2021-07-19 19:45:12 发布
本文探讨了变量声明顺序是否影响32位MCU的代码空间,以及此现象在结构体和联合体中的表现。虽然特定顺序能节省局部空间,但全局来看,编译器的优化和链接过程会抵消这种节省,实际操作中的影响有限。
摘要由CSDN通过智能技术生成