×
嵌入式 > 嵌入式开发 > 详情

ARM优化之结构体的定义

发布时间:2020-08-27 发布时间:
|
偶然的一次发现,看到自己定义的结构体编译出来的大小和我想象的不一样,于是便追溯了一下根源。做了一系列实验之后发现,ARM的结构体的内存分配上有着一些固有的做法。废话不多说,看例子。

实验一:

我定义一个结构体:

typedef struct TestStruct

{

unsinged char Test1;

unsigned int Test2;

unsigned char Test3;

unsigned int Test4;

unsigned short Test5;

}TEST_STRUCT;

TEST_STRUCT TestStruct1;

然后我分别给这些成员都赋值,以便于在Memory里面观察。

TestStruct1.Test1 = 0x11;

TestStruct1.Test2 = 0x22334455;

TestStruct1.Test3 = 0x66;

TestStruct1.Test4 = 0x778899AA;

TestStruct1.Test5 = 0xBBCC;

然后我调用了sizeof函数来计算这个结构体的大小

sizeof(TestStruct1)

发现大小是20个Byte。而我原先预计的大小为1+4+1+4+2=12个Byte。

于是我利用AXD的内存监控查看了这段内存的分配(Little Endian),如下:

0x01,0x00,0x00,0x00,0x55,0x44,0x33,0x22,0x66,0x00,0x00,0x00,0xAA,0x99,0x88,0x77

0xCC,0xBB,0x00,0x00

发现ARM在编译的时候把原先不足Word长度的扩展成了Word长度。

实验二:

后来想到,可能ARM这么做是为了不破坏结构体的结构。于是把结构体改成了:

typedef struct TestStruct

{

unsinged char Test1;

unsigned char Test3;

unsigned short Test5;

unsigned int Test2;

unsigned int Test4;

}TEST_STRUCT;

再次调用sizeof,发现大小变成了12个Byte,符合了原先预计的大小。

再监控内存分配,如下:

0x01,0x06,0xCC,0xBB,0x55,0x44,0x33,0x22,0xAA,0x99,0x88,0x77

由此发现,原本松散的内存变得如此的紧凑。

实验三:

随后,又猜想,这样是否真的可以缩小内存损耗呢?ARM会不会在结构体的中间插入别的变量呢。

于是做了一个实验,建立了三个BYTE大小的变量。

unsigned char TestData0 = 0xDD;

unsigned char TestData1 = 0xEE;

unsigned char TestData2 = 0xFF;

然后结构体恢复成实验一的状态,监控了下内存,发现变成了:

0x01,0x00,0x00,0x00,0x55,0x44,0x33,0x22,0x66,0x00,0x00,0x00,0xAA,0x99,0x88,0x77

0xCC,0xBB,0x00,0x00,0xDD,0xEE,0xFF

看来ARM并没有在松散的结构体中插入别的变量。

实验四:

利用了自己的一个大的工程,200K左右的RO以及80K左右的RW+ZI,做了一下优化,发现效果明显,RW+ZI缩减了不少。

最后,想到了ADS里面的编译选项,三个级别的优化以及For time/For spce选项都不能改变这个结果。

结论:(本文基于ARM7TDMI)

ARM中结构体的成员的写法可以决定最后的耗用内存的大小,适当的优化可以节省大量宝贵的RAM。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
五大标准轻松搞定4K超高清电视选购