C++ 結構體struct和共同體union的區別

石虎132發表於2018-02-10

 //聯絡人:石虎 QQ:1224614774 暱稱:嗡嘛呢叭咪哄


一、概念


1.定義:

  結構體struct:把不同型別的資料組合成一個整體,自定義型別。

  共同體union: 使幾個不同型別的變數共同佔用一段記憶體。


2.地址:

   structunion都有記憶體對齊,結構體的記憶體佈局依賴於CPU、作業系統、編譯器及編譯時的對齊選項。



二、關於記憶體對齊,四個重要的基本概念:


1.資料型別自身的對齊值:

  對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,單位位元組。

2.結構體或者類的自身對齊值:       其成員中自身對齊值最大的那個值。

3.指定對齊值:                   #pragma pack(n),n=1,2,4,8,16改變系統的對齊係數

4.資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中小的那個值。


  注意:long intint一樣是4byte,long doubledouble一樣是8byte。



三、常見資料型別及其長度:

 

  1.在標準c++中,int的定義長度要依靠你的機器的字長,也就是說,如果你的機器是32位的,int的長度為32位,如果你的機器是64位的,那麼int的標準長度就是64位。

   圖:

   


  2.首先根據結構體內部成員的自身對齊值得到結構體的自身對齊值(內部成員最大的長度),如果沒有修改系統設定的預設補齊長度4的話,取較小的進行記憶體補齊。



四、結構體struct和共同體union區別


   結構體struct不同之處,stuct裡每個成員都有自己獨立的地址。sizeof(struct)是記憶體對齊後所有成員長度的加和。

   共同體union 當共同體中存入新的資料後,原有的成員就失去了作用,新的資料被寫到union的地址中。sizeof(union)是最長的資料成員的長度。



五、總結:

    

   1.structunion都是由多個不同的資料型別成員組成, 但在任何同一時刻, union中只存放了一個被選中的成員, 而struct的所有成員都存在。

   2.struct中,各成員都佔有自己的記憶體空間,它們是同時存在的。一個struct變數的總長度等於所有成員長度之和。

   3.union中,所有成員不能同時佔用它的記憶體空間,它們不能同時存在。Union變數的長度等於最長的成員的長度。對於union的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於struct的不同成員賦值是互不影響的。



 謝謝!!!

相關文章