c/c++ union

一、概念

        中文稱爲共用體或聯合體。主要用於共享內存,在C/C++程序的編寫中,當多個基本數據類型或複合數據結構要佔用同一片內存時,我們要使用聯合體;當多種類型,多個對象,多個事物只取其一時(我們姑且通俗地稱其爲“n 選1”),我們也可以使用聯合體來發揮其長處。

       在“聯合”中,各成員共享一段內存空間, 一個聯合變量的長度等於各成員中最長的長度。應該說明的是, 這裏所謂的共享不是指把多個成員同時裝入一個聯合變量內, 而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則衝去舊值。

二、舉例

(1)用union判斷大小端


union var{

        char c[4];
        int i;
};


int main(){
        var data;
        data.c[0] = 0x04;
        data.c[1] = 0x03;
        data.c[2] = 0x02;
        data.c[3] = 0x11;

//數組中下標低的,地址也低,按地址從低到高,內存內容依次爲:04,03,02,11。總共四字節!
//而把四個字節作爲一個整體,應該從內存高地址到低地址看,0x11020304,低位04放在低地址上。
        printf("%x\n",data.i);
}

結果:
      11020304       //證明是小端(little-endian)

(2)含有struct的union

#include <stdio.h>
void main()
{
   union number
  {
       int i;

       struct

       {
          char first;
          char second;
       }half;

  }num;
  num.i=0x4241; /*聯合成員賦值*/
  printf("%c%c/n", num.half.first, num.half.second);
  num.half.first='a'; /*聯合中結構成員賦值*/
  num.half.second='b';
  printf("%x/n", num.i);
}
輸出結果爲: 
AB 
6261

三、帶對象的union

      由於union裏面的東西共享內存,所以不能定義靜態、引用類型的變量。由於在union裏也不允許存放帶有構造函數、析構函數和複製構造函數等的類的對象,但是可以存放對應的類對象指針。編譯器無法保證類的構造函數和析構函數得到正確的調用,由此,就可能出現內存泄漏。所以,我們在C++中使用union時,儘量保持C語言中使用union的風格,儘量不要讓union帶有對象。
發佈了31 篇原創文章 · 獲贊 31 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章