聯合體(union)以及資料的儲存

2021-07-27 21:12:41 字數 2326 閱讀 6372

當多個資料需要共享記憶體或多個資料每次只取其一時,可以利用聯合體(union),有關聯合體的描述如下:

1.聯合體是乙個結構;

2.它的所有成員相對於基位址的偏移量都為0;

3.此結構空間要大到足夠容納最"寬"的成員;

4.其對齊方式要適合其中所有的成員。

對上面四句話的理解:

由於聯合體的所有成員是共享一段記憶體的,因此每個成員的存放首位址相對於聯合體變數的基位址額偏移量為0,即所有成員的首位址都是一樣的。為了使得所有成員能夠共享一段記憶體,因此該空間必須足夠容納這些成員中最寬的成員。再來著重介紹一下什麼叫"對其方式要適合其中所有的成員"?

例如:

因為u1中有最強對齊要求的是b欄位(int),所以u1物件的首位址一定是4的倍數,那麼上述記憶體的布局中的b欄位能滿足int型別的對齊要求嗎?顯然是不能的,於是有了如下的位址分配方案:

這個方案在a與b之間多分配了3個填充(padding)位元組,這樣當整個struct物件首位址滿足4位元組的對齊要求時,b欄位也一定能滿足int型的4位元組對齊規定。那麼sizeof(u1)顯然就應該是8,而b欄位相對於結構體首位址的便宜就是4。我們看一下程式給的結果吧:

那麼下面這個呢?

typedef struct u2

u2;其實和上例子是一樣的,sizeof(u2)也是8。

好的,現在你已經掌握了結構體內存布局的基本準則,嘗試分析乙個稍微複雜點的型別吧。

例如:

typedef struct u

u1;

先來分析一下,a佔9位元組,b佔4位元組,d佔8位元組,這裡最"寬"的變數是a,因此記憶體大小至少是9。像上面的例子一樣,u1的位址最前面是9個位元組,然後在a和b之間多分配了3個填充(padding)位元組,在然後是b的4個位元組,最後是d的8個位元組。sizeof(u1)=24。看看程式執行的結果吧:

下面來個有關union使用的測試程式加深理解:

#includeunion un

u;int main()

程式執行結果如下:

在程式中,由於聯合體的特點,變數x佔4個位元組。我們可以從3個角度觀察這4個位元組:

(1)整體看,是乙個int型資料;

( 2)分成2部分看,是兩個短整型資料;

(3)分成4部分看,是4個單位元組的資料。

但無論怎麼看,就是這4個位元組。無論用哪種形式運算元據,使用的也就是這4個位元組。聯合體為我們提供了從不同的角度使用這4個位元組的方式。

x.c[0]到x.c[3]的值分別為65\66\67\68,這好理解。

x,si[0]佔2位元組,與x.c[0]和x.c[1]相同。驗證一下:16961=66*256+65(66是'b'的ascii值,65是'a'的ascii值,是字元的儲存形式)。注意,這裡體現儲存資料時低位在前,高位在後,低位是65,高位時66。正如十進位制數98,高位時9,低位是8,所以98=9*10+8一樣。因為是高位,所以乘以權位10,表示9這個符號代表的其實是90。66*256,因為儲存66('b')的那乙個位元組的位置,比儲存65('a')的那一位元組的位置高8位,所以乘以2的8次方,即256。

概括講,儲存2位元組的16961時,其低8位,是65,在前(x.c[0]),而其高8位,是66,在(x.c[1])。低位在前,高位在後。

請自行驗證:17475=68*256+67,提現低位在前,高位在後。(x.si[1]佔2位元組,與x.c[2]和x.c[3]相同)。

再請驗證:1145258561=17475*256*256+16961,也體現在低位在前,高位在後。(x.i佔4位元組,與x.si[0]和x.si[1]相同)。

再請驗證:1145258561=68*256*256*256+67*256*256+66*256+65。同樣的道理。

union聯合體學習

union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...

聯合體union筆記

當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體 union 1 聯合體是乙個結構 2 它的所有成員相對於基位址的偏移量都為0 3 此結構空間要大到足夠容納最 寬 的成員 4 其對齊方式要適合其中所有的成員 下面解釋這四條描述 由於聯合體中的所有成員是共享一段記憶體的,因此每個成員...

union聯合體學習

union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...