<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM優(yōu)化之結構體的定義

ARM優(yōu)化之結構體的定義

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò ) 收藏
偶然的一次發(fā)現,看到自己定義的結構體編譯出來(lái)的大小和我想象的不一樣,于是便追溯了一下根源。做了一系列實(shí)驗之后發(fā)現,ARM的結構體的內存分配上有著(zhù)一些固有的做法。廢話(huà)不多說(shuō),看例子。

實(shí)驗一:

本文引用地址:http://dyxdggzs.com/article/201611/316811.htm

我定義一個(gè)結構體:

typedef struct TestStruct

{

unsinged char Test1;

unsigned int Test2;

unsigned char Test3;

unsigned int Test4;

unsigned short Test5;

}TEST_STRUCT;

TEST_STRUCT TestStruct1;

然后我分別給這些成員都賦值,以便于在Memory里面觀(guān)察。

TestStruct1.Test1 = 0x11;

TestStruct1.Test2 = 0x22334455;

TestStruct1.Test3 = 0x66;

TestStruct1.Test4 = 0x778899AA;

TestStruct1.Test5 = 0xBBCC;

然后我調用了sizeof函數來(lái)計算這個(gè)結構體的大小

sizeof(TestStruct1)

發(fā)現大小是20個(gè)Byte。而我原先預計的大小為1+4+1+4+2=12個(gè)Byte。

于是我利用AXD的內存監控查看了這段內存的分配(Little Endian),如下:

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

0xCC,0xBB,0x00,0x00

發(fā)現ARM在編譯的時(shí)候把原先不足Word長(cháng)度的擴展成了Word長(cháng)度。

實(shí)驗二:

后來(lái)想到,可能ARM這么做是為了不破壞結構體的結構。于是把結構體改成了:

typedef struct TestStruct

{

unsinged char Test1;

unsigned char Test3;

unsigned short Test5;

unsigned int Test2;

unsigned int Test4;

}TEST_STRUCT;

再次調用sizeof,發(fā)現大小變成了12個(gè)Byte,符合了原先預計的大小。

再監控內存分配,如下:

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

由此發(fā)現,原本松散的內存變得如此的緊湊。

實(shí)驗三:

隨后,又猜想,這樣是否真的可以縮小內存損耗呢?ARM會(huì )不會(huì )在結構體的中間插入別的變量呢。

于是做了一個(gè)實(shí)驗,建立了三個(gè)BYTE大小的變量。

unsigned char TestData0 = 0xDD;

unsigned char TestData1 = 0xEE;

unsigned char TestData2 = 0xFF;

然后結構體恢復成實(shí)驗一的狀態(tài),監控了下內存,發(fā)現變成了:

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

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

看來(lái)ARM并沒(méi)有在松散的結構體中插入別的變量。

實(shí)驗四:

利用了自己的一個(gè)大的工程,200K左右的RO以及80K左右的RW+ZI,做了一下優(yōu)化,發(fā)現效果明顯,RW+ZI縮減了不少。

最后,想到了ADS里面的編譯選項,三個(gè)級別的優(yōu)化以及For time/For spce選項都不能改變這個(gè)結果。

結論:(本文基于A(yíng)RM7TDMI)

ARM中結構體的成員的寫(xiě)法可以決定最后的耗用內存的大小,適當的優(yōu)化可以節省大量寶貴的RAM。



關(guān)鍵詞: ARM優(yōu)化結構

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>