• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            road420

            導航

            <2006年10月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            統計

            常用鏈接

            留言簿(2)

            隨筆檔案

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            結構體的對齊

            由一道面試題來看 Struct 的對界

            ?

            本文節選自宋寶華的C/C++struct深層探索一文,本人對其所描述的struct對齊比較喜歡,為此轉來與大家分享,原文見http://blog.donews.com/21cnbao/archive/2005/09/08/544877.aspx

            ?

            Intel 、微軟等公司曾經出過一道類似的面試題:

            1. #include <iostream.h>

            2. #pragma pack(8)

            3. struct example1

            4. {

            5. ? ??short a;

            6. ? ??long b;

            7. };

            8. struct example2

            9. {

            10. ?????? ??char c;

            11. ?????? ??example1 struct1;

            12. ?????? ??short e;

            13. };

            14. #pragma pack()

            ?

            15. int main(int argc, char* argv[])

            16. {

            17. ?????? ??example2 struct2;

            18. ??cout << sizeof(example1) << endl;

            19. ??cout << sizeof(example2) << endl;

            20. ??cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)

            << endl;

            21. return 0;

            22. }

            問程序的輸入結果是什么?

            答案是:

            8

            16

            4

            不明白?還是不明白?下面一一道來:

            1 自然對界

            struct 是一種復合數據類型,其構成元素既可以是基本數據類型(如 int 、 long float 等)的變量,也可以是一些復合數據類型(如 array 、 struct union 等)的數據單元。對于結構體,編譯器會自動進行成員變量的對齊,以提高運算效率。缺省情況下,編譯器為結構體的每個成員按其自然對界( natural alignment )條件分配空間。各個成員按照它們被聲明的順序在內存中順序存儲,第一個成員的地址和整個結構的地址相同。

            自然對界 (natural alignment) 即默認對齊方式,是指按結構體的成員中 size 最大的成員對齊。

            例如:

            struct naturalalign

            {

            char a;

            short b;

            char c;

            };

            在上述結構體中, size 最大的是 short ,其長度為 2 字節,因而結構體中的 char 成員 a 、 c 都以 2 為單位對齊, sizeof(naturalalign) 的結果等于 6 ;

            如果改為:

            struct naturalalign

            {

            char a;

            int b;

            char c;

            };

            其結果顯然為 12

            ?

            2 指定對界

            一般地,可以通過下面的方法來改變缺省的對界條件:

            · 使用偽指令 #pragma pack (n) ,編譯器將按照 n 個字節對齊;

            · 使用偽指令 #pragma pack () ,取消自定義字節對齊方式。

            注意:如果 #pragma pack (n) 中指定的 n 大于結構體中最大成員的 size ,則其不起作用,結構體仍然按照 size 最大的成員進行對界。

            例如:

            #pragma pack (n)

            struct naturalalign

            {

            char a;

            int b;

            char c;

            };

            #pragma pack ()

            n 4 、 8 、 16 時,其對齊方式均一樣, sizeof(naturalalign) 的結果都等于 12 。而當 n 2 時,其發揮了作用,使得 sizeof(naturalalign) 的結果為 8 。

            posted on 2006-10-21 13:21 深邃者 閱讀(208) 評論(0)  編輯 收藏 引用

            国产精品久久久久久久久久影院| 狠狠综合久久AV一区二区三区| 国产精品久久久久影院嫩草| 国内精品伊人久久久久av一坑 | 国产综合久久久久久鬼色| 99久久99这里只有免费的精品| 国产AⅤ精品一区二区三区久久| 亚洲国产精品成人AV无码久久综合影院 | 色综合合久久天天综合绕视看 | 亚洲中文字幕无码一久久区| 久久久久夜夜夜精品国产| 久久无码专区国产精品发布| 国产成人99久久亚洲综合精品| 伊人久久大香线蕉AV一区二区| 91精品国产91久久久久福利| 亚洲国产一成久久精品国产成人综合| 99久久中文字幕| 久久综合久久自在自线精品自| 久久久亚洲欧洲日产国码是AV| 久久久久国产一级毛片高清板| 九九久久自然熟的香蕉图片| 精品综合久久久久久98| 久久91这里精品国产2020| 情人伊人久久综合亚洲| 性高湖久久久久久久久| 99久久精品免费看国产一区二区三区| 久久精品国产一区二区三区不卡| 久久超碰97人人做人人爱| 一本色道久久88精品综合 | 久久久精品国产亚洲成人满18免费网站 | 精品久久人人做人人爽综合| 日产精品久久久久久久| 综合网日日天干夜夜久久| 日韩精品久久久肉伦网站 | 人妻丰满?V无码久久不卡| 亚洲精品国产第一综合99久久| 亚洲午夜精品久久久久久人妖| 久久精品视频网| 久久99国产精品成人欧美| 久久久久国产| 久久久久se色偷偷亚洲精品av|