union介紹
共用體,也叫聯合體,在乙個「聯合」內可以定義多種不同的資料型別, 乙個被說明為該「聯合」型別的變數中,允許裝入該「聯合」所定義的任何一種資料,這些資料共享同一段記憶體,以達到節省空間的目的。union變數所占用的記憶體長度等於最長的成員的記憶體長度。
union與struct比較
先看乙個關於struct的例子:
struct student其struct的記憶體結構如下,sizeof(struct student)的值為12bytes。;
下面是關於union的例子:
union testsizeof(union test)的值為4。因為共用體將乙個char型別的mark、乙個long型別的num變數和乙個float型別的score變數存放在同乙個位址開始的記憶體單元中,而char型別和long型別所佔的記憶體位元組數是不一樣的,但是在union中都是從同乙個位址存放的,也就是使用的覆蓋技術,這三個變數互相覆蓋,而這種使幾個不同的變數共占同一段記憶體的結構,稱為「共用體」型別的結構。其union型別的結構如下:;
因union中的所有成員起始位址都是一樣的,所以&a.mark、&a.num和&a.score的值都是一樣的。
不能如下使用:
union test a;由於a的儲存區有好幾種型別,分別佔不同長度的儲存區,僅寫共用體變數名a,這樣使編譯器無法確定究竟輸出的哪乙個成員的值。printf("%d", a); //錯誤
printf("%d", a.mark); //正確測試大小端union的乙個用法就是可以用來測試cpu是大端模式還是小端模式:
#include using namespace std;上面**執行沒有問題。void checkcpu()
test;
test.a = 1;
if (test.c == 1)
cout << "little endian" <
舉例,**如下:
#include using namespace std;
union test
a;int main()
;union test
;int main()
如果在類ca中新增了建構函式,或者新增析構函式,就會發現程式會出現錯誤。由於union裡面的東西共享記憶體,所以不能定義靜態、引用型別的變數。由於在union裡也不允許存放帶有建構函式、析構函式和複製建構函式等的類的物件,但是可以存放對應的類物件指標。編譯器無法保證類的建構函式和析構函式得到正確的呼叫,由此,就可能出現記憶體洩漏。所以,在c++中使用union時,盡量保持c語言中使用union的風格,盡量不要讓union帶有物件。
c語言 union聯合體
linux中聯合體union實現判斷little endian 和 big endian 大端和小端 1 聯合體的資料成員從低位元組開始對齊 2 little endian 和 big endian。little endian 和 big endian 是 cpu 存放資料的兩種不同順序。對於整型 ...
C語言聯合體union
c語言中的聯合體union 在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也 可以使用聯合體來發揮其長處。首先看一段 union myun u int k a int ma...
union聯合體學習
union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...