日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ -- union介绍

發布時間:2023/12/18 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ -- union介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

union介紹

  共用體,也叫聯合體,在一個“聯合”內可以定義多種不同的數據類型, 一個被說明為該“聯合”類型的變量中,允許裝入該“聯合”所定義的任何一種數據,這些數據共享同一段內存,以達到節省空間的目的。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; }

舉例,代碼如下:

#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帶有對象。

?

參考:http://www.jellythink.com/archives/468

?

轉載于:https://www.cnblogs.com/jeakeven/p/5113508.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的c++ -- union介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。