struct與unin的區別

struct 簡單來說就是一些相互關聯的元素的集合,說是集合,其實它們在內存中的存放是有先後順序的,並且每個元素都有自己的內存空間。那麼按照什麼順序存放的呢?其實就是按你聲明的變量順序來存放的,下面先看一個例子:

struct sTest

{

int a;  //sizeof(int) = 4

char b;  //sizeof(char) = 1

shot c; //sizeof(shot) = 2

}x;

所以在內存中至少佔用 4+1+2 = 7 byte。然而實際中佔用的內存並不是7 byte,這就涉及到了字節對齊方式,可以參考轉載的《struct 字節對齊分析》,介紹的還是不錯的。

 

union 的不同之處就在於,它所有的元素共享同一內存單元,且分配給union 的內存 size 由類型最大的元素 size 來確定,如下的內存就爲一個double 類型 size :

union uTest

{

int a;   //sizeof(int) = 4

double b;  //sizeof(double) = 8

char c;  //sizeof(char) = 1

}x;

所以分配的內存 size 就是8 byte。

既然是內存共享,理所當然地,它不能同時存放多個成員的值,而只能存放其中的一個值,就是最後賦予它的值,如:

x.a = 3; x.b = 4.5; x.c = ‘A’;

這樣你只看到x.c = ‘A’,而其它已經被覆蓋掉,失去了意義。

 

說到這裏,大家應該已經明白兩者最關鍵的區別了吧,無非就在於內存單元的分配和使用。然而要靈活地使用 struct 和 union 還是存在許多小技巧的,比如:元素的相關性不強時,完全是可以使用union ,從而節省內存size; struct和 union 還可以相互嵌套。


http://blog.163.com/zhangsumei0712@126/blog/static/1043778322008111194755670/?COLLCC=3146474783&

http://www.letuknowit.com/archives/81


出個題,union{long,int k[5],char c}Date;

        struct{int,char,Date,char c[6]}AA;

那麼,sizeof(Date)+sizeof(AA)=???


首先很容易看出來union的大小爲20,那麼接下來看看struct,int(4)+char(1)=5,Date中最長的類型爲4(int和long),那麼5不是4的倍數,所以添加3,那麼=8是4的倍數了,接着8+Date(20)=28,是1(char)的倍數,總長,28+6(char c【6】)=34,而且,struct中最長的類型爲4(int以及Date中最長的類型),但是呢,34不是4的整數倍,需要+2補齊,所以sizeof(AA)=36。所以呢,sizeof(Date)+sizeof(AA)=36+20=56,這個是宇視的筆試題,當時想了好久。。哈哈

至於struct的規則呢,請看http://blog.csdn.net/sun5smile/article/details/8919469

發佈了5 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章