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