• <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>

            程序讓生活更美好

            半畝方塘 天光云影

              C++博客 ::  :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
              55 隨筆 :: 4 文章 :: 202 評(píng)論 :: 0 Trackbacks

            struct union 的區(qū)別

            在編程的時(shí)候,經(jīng)常會(huì)遇到使用一個(gè)變量處理多種數(shù)據(jù)的情況,在這種情況下,如果我們不考慮使用類,那么就可以是struct(結(jié)構(gòu))和union(聯(lián)合)來進(jìn)行處理。那么,這兩種結(jié)構(gòu)之間到底有什么不同呢?

            可以先看下面的一個(gè)小例子。

             1 #include  < iostream >
             2 using   namespace  std;
             3
             4 union U1 {
             5      char  c;
             6      int  i;
             7      double  d;
             8     }
            ;
             9 union U2 {
            10      char  c;
            11      // int i;
            12      // double d;
            13     }
            ;
            14
            15 union U3 {
            16      char  c;
            17      int  i;
            18      // double d;
            19     }
            ;
            20
            21 struct  S1 {
            22      char  c;
            23      int  i;
            24      double  d;
            25     }
            ;
            26
            27 struct  S2 {
            28      char  c;
            29      int  i;
            30      // double d;
            31     }
            ;
            32
            33 int  main() {
            34     cout << " U1's size = " << sizeof (U1) << endl;
            35     cout << " U2's size = " << sizeof (U2) << endl;
            36     cout << " U3's size = " << sizeof (U3) << endl;
            37     cout << endl;
            38     cout << " -------------------------------- " << endl;
            39     cout << " S1's size = " << sizeof (S1) << endl;
            40     cout << " 其中 " << sizeof ( char ) << " + " << sizeof ( int ) << " + " << sizeof ( double ) << " = " << sizeof ( char ) + sizeof ( int ) + sizeof ( double ) << endl;
            41     cout << " ---------- " << endl;
            42     cout << " S2's size = " << sizeof (S2) << endl;
            43     cout << " 其中 " << sizeof ( char ) << " + " << sizeof ( int ) << " = " << sizeof ( char ) + sizeof ( int ) << endl;
            44     cout << " -------------------------------- " << endl;
            45     S1 s;
            46     s.c = ' A ' ;
            47         cout << " 1 s.c =  " << s.c << endl;
            48     s.d = 23.2132 ;
            49         cout << " 1 s.d =  " << s.d << endl;
            50
            51         cout << " 2 s.c =  " << s.c << endl;
            52         cout << " 2 s.d =  " << s.d << endl;
            53         cout << " -----------------------  " << endl;
            54     U1 u;
            55         u.c = ' A ' ;
            56         cout << " 1 u.c =  " << u.c << endl;
            57     
            58         u.i = 23322 ;
            59         cout << " 1 u.i =  " << u.i << endl;
            60
            61         u.d = 23.2132 ;
            62         cout << " 1 u.d =  " << u.d << endl;
            63         cout << " 2 u.c =  " << u.c << endl;
            64         cout << " 2 u.i =  " << u.i << endl;
            65      return   0 ;
            66 }

            67

            輸出結(jié)果為:

            U1's size =8

            U2's size =1

            U3's size =4

             

            --------------------------------

            S1's size =16

            其中 1+4+8=13

            ----------

            S2's size =8

            其中 1+4=5

            --------------------------------

            1 s.c = A

            1 s.d = 23.2132

            2 s.c = A

            2 s.d = 23.2132

            -----------------------

            1 u.c = A

            1 u.i = 23322

            1 u.d = 23.2132

            2 u.c =

            2 u.i = 1181975000

            解釋:

            struct 類型的內(nèi)存分配是結(jié)合內(nèi)部的所有變量大小和相關(guān)的,但不是簡(jiǎn)單的相加,從上面的例子就可以看出來, struct 類型的分配的內(nèi)存大小是應(yīng)該內(nèi)部最大數(shù)據(jù)類型的整數(shù)倍,不足一倍的部分會(huì)自動(dòng)補(bǔ)全成一倍大小,應(yīng)該是編譯器為了數(shù)據(jù)整齊,處理速度會(huì)快些把。 union 類型的內(nèi)存分配,只是和聯(lián)合體內(nèi)的最大的一個(gè)數(shù)據(jù)類型的大小相關(guān),而且 union 內(nèi)的所有數(shù)據(jù)都在一個(gè)單獨(dú)的內(nèi)存空間里面。這些就是上面程序出現(xiàn)這樣的結(jié)果的原因。


               所以,
            u.c 的值是 A ,當(dāng)給聯(lián)合體內(nèi)的其他變量賦值之后, u.c 的值就是一個(gè)無用的信息。同樣, u.i 的值最初是 23322 ,當(dāng)給 u.d 賦值 23.2132 之后, u.i 的值就變得無用了。


            posted on 2006-03-20 17:02 北風(fēng)之神007 閱讀(9981) 評(píng)論(5)  編輯 收藏 引用 所屬分類: c/c++

            評(píng)論

            # re: struct 與union的區(qū)別 2007-09-07 10:47 路人甲
            謝謝~~ 學(xué)到了不少

            不過感覺struct類型的分配的內(nèi)存大小應(yīng)該是,大于等于內(nèi)部所有變量大小的和的一個(gè)2的密指數(shù)。
              回復(fù)  更多評(píng)論
              

            # re: struct 與union的區(qū)別 2008-01-26 11:42 路人已
            真的很感謝,終于知道了union的優(yōu)點(diǎn)了*^_^*  回復(fù)  更多評(píng)論
              

            # re: struct 與union的區(qū)別 [未登錄] 2008-11-04 15:23 tom
            memory alignment@路人甲
              回復(fù)  更多評(píng)論
              

            # re: struct 與union的區(qū)別 2010-09-21 09:08 愛的隧道
            @路人甲
            應(yīng)該是不小于所有變量的和且最接近之的4的倍數(shù)。  回復(fù)  更多評(píng)論
              

            # re: struct 與union的區(qū)別 [未登錄] 2011-09-23 15:02 aaaa
            最后為什么2 u.i = 1181975000?  回復(fù)  更多評(píng)論
              

            久久99热这里只有精品66| 久久精品无码一区二区日韩AV | A级毛片无码久久精品免费 | 麻豆亚洲AV永久无码精品久久| 97精品伊人久久久大香线蕉| 996久久国产精品线观看| 久久综合色区| AV狠狠色丁香婷婷综合久久| 欧美性大战久久久久久| 香蕉久久夜色精品升级完成| 国产69精品久久久久99| 中文国产成人精品久久不卡| 国产99久久久久久免费看| 久久久久青草线蕉综合超碰| 99久久精品国产一区二区| 久久亚洲AV成人无码国产| 午夜福利91久久福利| 久久亚洲国产中v天仙www | 精品国产VA久久久久久久冰| 久久久99精品成人片中文字幕 | 狠狠色婷婷综合天天久久丁香 | 久久久SS麻豆欧美国产日韩| 国产香蕉97碰碰久久人人| 久久久国产乱子伦精品作者| 伊人久久亚洲综合影院| 久久国产影院| 久久www免费人成精品香蕉| 蜜臀久久99精品久久久久久小说 | 久久久久久a亚洲欧洲aⅴ| 97久久国产综合精品女不卡| 伊人久久成人成综合网222| 久久久久国产一区二区| 久久精品国产WWW456C0M| 国产精品99久久久久久猫咪| 久久综合综合久久97色| 女人香蕉久久**毛片精品| 国产精品一区二区久久不卡| AV无码久久久久不卡网站下载| 精品久久久噜噜噜久久久| 精品久久久久久久| 99久久精品国产毛片|