新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 漫談c語言結構體

        漫談c語言結構體

        作者: 時間:2016-12-01 來源:網絡 收藏

        再看看char_long_short這個結構體,char_long_short的地址分布情況如下表:

        成員變量

        成員變量十六進制地址

        成員變量十進制地址

        char_long_short.c

        0x0012FF2C

        1244972

        char_long_short.l

        0x0012FF30

        1244976

        char_long_short.s

        0x0012FF34

        1244980

        可見,其內存分布圖如下,共12bytes:

        地址

        1244972

        1244973

        1244974

        1244975

        1244976

        1244977

        1244978

        1244979

        1244980

        1244981

        1244982

        1244983

        成員

        .c

        .l

        .s

        首先,1244972能被1整除,所以char_long_short.c放在1244972處沒有問題(其實,就char型成員變量自身來說,其放在任何地址單元處都沒有問題),根據原則1,在之后的1244973~1244975中都沒有能被4(因為sizeof(long)=4bytes)整除的,1244976能被4整除,所以char_long_short.l應該放在1244976處,那么同理,最后一個.s(sizeof(short)=2bytes)是應該放在1244980處。

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

        至此,一個結構體的內存布局完成了。

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

        struct//聲明結構體char_long_short_new

        {

        charc;

        charadd1;//補齊空間
        charadd2;//補齊空間
        charadd3;//補齊空間

        longl;

        shorts;


        charadd4;//補齊空間
        charadd5;//補齊空間

        }char_long_short_new;

        運行結果如下:

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


        所以,無論你是在VC6.0還是KeilC51,還是KeilMDK中,當你需要定義一個結構體時,只要你稍微留心結構體成員變量內存對齊這一現象,就可以在很大程度上節約MCU的RAM。這一點不僅僅應用于實際編程,在很多大型公司,比如IBM、微軟、百度、華為的筆試和面試中,也是常見的。

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


        上一頁 1 2 3 下一頁

        關鍵詞: c語言結構

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 洞口县| 贵南县| 浪卡子县| 常宁市| 繁昌县| 旬邑县| 洪泽县| 云梦县| 博兴县| 通渭县| 房山区| 凯里市| 双城市| 昆山市| 漯河市| 德江县| 元氏县| 方正县| 中宁县| 丰都县| 得荣县| 桃江县| 巴东县| 沂源县| 巴楚县| 微山县| 西宁市| 绥宁县| 潞城市| 禹州市| 阜城县| 灵山县| 陵水| 吉水县| 景洪市| 博野县| 东莞市| 大邑县| 揭西县| 株洲市| 城口县|