C++中的union(联合体,共用体,数据变量可以共享内存,以节省内存空间)
union介紹
C++的union本質上也是個類,跟struct性質幾乎一致但是有一個最大的區別,數據共享內存。 說到共享內存就要說下union的內存分配:union的大小是按照union里面的成員內存的最大值而分配的,函數不占內存,但是如果沒有成員或者成員都是函數時,內存分配為1,占位,表明存在。
共用體,也叫聯合體或共同體,在一個“聯合”內可以定義多種不同的數據類型, 一個被說明為該“聯合”類型的變量中,允許裝入該“聯合”所定義的任何一種數據,這些數據共享同一段內存,以達到節省空間的目的。union變量所占用的內存長度等于最長的成員的內存長度。
?
union與struct比較
先看一個關于struct的例子:
struct student {char mark;long num;float score; };其struct的內存結構如下,sizeof(struct student)的值為12bytes。
下面是關于union的例子:
union test {char mark;long num;float score; };sizeof(union test)的值為4。因為共用體將一個char類型的mark、一個long類型的num變量和一個float類型的score變量存放在同一個地址開始的內存單元中,而char類型和long類型所占的內存字節數是不一樣的,但是在union中都是從同一個地址存放的,也就是使用的覆蓋技術,這三個變量互相覆蓋,而這種使幾個不同的變量共占同一段內存的結構,稱為“共用體”類型的結構。其union類型的結構如下:
因union中的所有成員起始地址都是一樣的,所以&a.mark、&a.num和&a.score的值都是一樣的。
?
不能如下使用:
union test a; printf("%d", a); //錯誤由于a的存儲區有好幾種類型,分別占不同長度的存儲區,僅寫共用體變量名a,這樣使編譯器無法確定究竟輸出的哪一個成員的值。
printf("%d", a.mark); //正確?
測試大小端
union的一個用法就是可以用來測試CPU是大端模式還是小端模式:
#include <iostream> using namespace std;void checkCPU() {union MyUnion{int a;char c;}test;test.a = 1;if (test.c == 1)cout << "little endian" <<endl;else cout << "big endian" <<endl; }int main() {checkCPU();return 0; }```union用法舉例:#include <iostream> using namespace std;union test {char mark;long num;float score; }a;int main() {// cout<<a<<endl; // wronga.mark = 'b';cout<<a.mark<<endl; // 輸出'b'cout<<a.num<<endl; // 98 字符'b'的ACSII值cout<<a.score<<endl; // 輸出錯誤值a.num = 10;cout<<a.mark<<endl; // 輸出換行 非常感謝suxin同學的指正cout<<a.num<<endl; // 輸出10cout<<a.score<<endl; // 輸出錯誤值a.score = 10.0;cout<<a.mark<<endl; // 輸出空cout<<a.num<<endl; // 輸出錯誤值cout<<a.score<<endl; // 輸出10return 0; }C++中union上面總結的union使用法則,在C++中依然適用。如果加入對象呢?#include <iostream> using namespace std;class CA {int m_a; };union Test {CA a;double d; };int main() {return 0; }上面代碼運行沒有問題。如果在類CA中添加了構造函數,或者添加析構函數,就會發現程序會出現錯誤。由于union里面的東西共享內存,所以不能定義靜態、引用類型的變量。由于在union里也不允許存放帶有構造函數、析構函數和復制構造函數等的類的對象,但是可以存放對應的類對象指針。編譯器無法保證類的構造函數和析構函數得到正確的調用,由此,就可能出現內存泄漏。所以,在C++中使用union時,盡量保持C語言中使用union的風格,盡量不要讓union帶有對象。參考來源:https://www.cnblogs.com/jeakeven/p/5113508.htmlhttps://www.cnblogs.com/yangrlee/p/5170206.html總結
以上是生活随笔為你收集整理的C++中的union(联合体,共用体,数据变量可以共享内存,以节省内存空间)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样删除word里的形状
- 下一篇: 汇编中的LABEL详解