天天看點

c語言union記憶體大小,C語言、C++中的union用法總結

開始的話

已經好長時間沒有更新了,對不起自己,更對不起我親愛的讀者,同時也對不起自己開辦的這個部落格平台。忙,太忙了,忙于找工作,找一份好工作,糾結于去大城市闖呢,還是回到本省的首府城市。大家都在糾結這個問題,也希望大家和我讨論讨論。别的先不說了,都工作這麼長時間了,還回過頭來總結union,确實有點過分,要是和大家說我一直從事于C++開發,還不懂union,大家可能還真的不信。我們每天都在總結那些看似高端的東西,什麼設計模式(當然我也有總結了)、重構(後期我也會說的了)了,卻忽略了那些最基礎,最根本的知識點。今天别人問我,我蒙了,是以,就有了這篇文章。

什麼是union?

翻譯過來說,就是共用體,或者也叫聯合體。說到了union,也就是共用體,就不得不說一下struct了,當我們有如下的struct的定義時:

代碼如下:

struct student

{

char mark;

long num;

float score;

};

關于struct的記憶體結構,将就會像下圖所示這樣(在x86機器上示範):

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類型的結構如下:

上面也說了,sizeof(union test)的值為4。那為什麼是4呢?大體上來說,結構體struct所占用的記憶體為各個成員的占用的記憶體之和(當然也需要考慮記憶體對齊的問題了)。而對于union來說,在譚浩強的《C語言程式設計》中這麼說:union變量所占用的記憶體長度等于最長的成員的記憶體長度。很顯然,這是不對的,對于union所占用的記憶體大小,需要考慮記憶體對齊的問題。這就是為什麼sizeof(union test)的值為4啦。

C中使用union

說的再好,再多,終歸都是要在使用的,下面就好好的說說C中使用union。和struct一樣,union隻有先定義了共用體變量才能引用它。而且不能直接引用共用體變量,而隻能引用共用體變量中的成員。就像我上面定義的union test。我們不能像下面這樣直接引用union:

代碼如下:

union test a;

printf("%d", a);

這種直接引用是錯誤的,由于a的存儲區有好幾種類型,分别占不同長度的存儲區,僅寫共用體變量名a,這樣使編譯器無法确定究竟輸出的哪一個成員的值。是以,應該寫成下面這樣:

代碼如下:

printf("%d", a.mark);

同時,在使用union的時候,我們還需要注意以下的幾點:

1.同一個記憶體段可以用來存放幾種不同類型的成員,但在每一個時刻隻能存在其中一種,而不是同時存放幾種。也就是說,每一瞬間隻有一個成員起作用,其它的成員不起作用,即不是同時都存在和起作用。

2.共用體變量中起作用的成員是最後一個存放的成員,在存入一個新的成員後,原有的成員就失去作用。比如以下的代碼:

代碼如下:

#include

using namespace std;

union test

{

char mark;

long num;

float score;

}a;

int main()

{

// cout