新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 漫談c語(yǔ)言結(jié)構(gòu)體

漫談c語(yǔ)言結(jié)構(gòu)體

作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏

再看看char_long_short這個(gè)結(jié)構(gòu)體,char_long_short的地址分布情況如下表:

成員變量

成員變量十六進(jìn)制地址

成員變量十進(jìn)制地址

char_long_short.c

0x0012FF2C

1244972

char_long_short.l

0x0012FF30

1244976

char_long_short.s

0x0012FF34

1244980

可見(jiàn),其內(nèi)存分布圖如下,共12bytes:

地址

1244972

1244973

1244974

1244975

1244976

1244977

1244978

1244979

1244980

1244981

1244982

1244983

成員

.c

.l

.s

首先,1244972能被1整除,所以char_long_short.c放在1244972處沒(méi)有問(wèn)題(其實(shí),就char型成員變量自身來(lái)說(shuō),其放在任何地址單元處都沒(méi)有問(wèn)題),根據(jù)原則1,在之后的1244973~1244975中都沒(méi)有能被4(因?yàn)閟izeof(long)=4bytes)整除的,1244976能被4整除,所以char_long_short.l應(yīng)該放在1244976處,那么同理,最后一個(gè).s(sizeof(short)=2bytes)是應(yīng)該放在1244980處。

是不是這樣就結(jié)束了?不是,還有原則2。根據(jù)原則2的要求,char_long_short這個(gè)結(jié)構(gòu)體所占的空間大小應(yīng)該是其占內(nèi)存空間最大的成員變量的大小的整數(shù)倍。如果我們到此就結(jié)束了,那么char_long_short所占的內(nèi)存空間是1244972~1244981共計(jì)10bytes,不符合原則2,所以,必須在最后補(bǔ)齊2個(gè)bytes(1244982~1244983)。

至此,一個(gè)結(jié)構(gòu)體的內(nèi)存布局完成了。

下面我們按照上述原則,來(lái)驗(yàn)證這樣的分析是不是正確。按上面的分析,地址單元1244973、1244974、1244975以及1244982、1244983都是空的(至少char_long_short未用到,只是“占位”了)。如果我們的分析是正確的,那么,定義這樣一個(gè)結(jié)構(gòu)體,其所占內(nèi)存也應(yīng)該是12bytes:

struct//聲明結(jié)構(gòu)體char_long_short_new

{

charc;

charadd1;//補(bǔ)齊空間
charadd2;//補(bǔ)齊空間
charadd3;//補(bǔ)齊空間

longl;

shorts;


charadd4;//補(bǔ)齊空間
charadd5;//補(bǔ)齊空間

}char_long_short_new;

運(yùn)行結(jié)果如下:

可見(jiàn),我們的分析是正確的。至于原則3,大家可以自己編程驗(yàn)證,這里就不再討論了。


所以,無(wú)論你是在VC6.0還是KeilC51,還是KeilMDK中,當(dāng)你需要定義一個(gè)結(jié)構(gòu)體時(shí),只要你稍微留心結(jié)構(gòu)體成員變量?jī)?nèi)存對(duì)齊這一現(xiàn)象,就可以在很大程度上節(jié)約MCU的RAM。這一點(diǎn)不僅僅應(yīng)用于實(shí)際編程,在很多大型公司,比如IBM、微軟、百度、華為的筆試和面試中,也是常見(jiàn)的。

本例完整的程序代碼下載:http://www.51hei.com/f/cjgt.rar


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: c語(yǔ)言結(jié)構(gòu)

評(píng)論


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

關(guān)閉