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&
出個題,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