Struct 和 Union 的詳細區別

Union: 共用體spa

Struct:結構體內存

二者的區別:io

1:共用體和結構體都是由多個不一樣的數據類型成員組成, 但在任何同一時刻, 共用體只存放一個被選中的成員, 而結構體則存放全部的成員變量。class

2:對於共用體的不一樣成員賦值,將會對其餘成員重寫, 原來成員的值就不存在了, 而對於結構體的不一樣成員賦值是互不影響的變量

3:內存分配不一樣數據類型

union的大小爲其內部全部變量的最大值,按照最大類型的倍數進行分配大小
如:
typedef Union 
{
char c[10];
char cc1;
}u11;nio

typedef union 
{
char c[10];
int i;
}u22;方法

typedef union 
{
char c[10];
double d;
}u33;數據

sizeof(u11)結果是10
sizeof(u22)結果是12,按照sizeof(int)*3分配空間
sizeof(u33)結果是16,按照sizeof(double)*2分配空間。內存分配

結構體struct非配方法相似,也是按照最大類型的倍數進行分配大小,可是還與順序有關
如:
typedef struct s1
{
char c;
double d;
}s11;


typedef struct s2
{
char c;
char cc;
double d;
}s22;

typedef struct s3
{
char c;
double d;
char cc;
}s33;

sizeof(s11)結果是應該是9,可是系統按照sizeof(double)*2分配,因此大小是16

sizeof(s22)結果是應該是10,可是系統按照sizeof(double)*2分配,因此大小是16,先分配8字節給cc佔用一個字節,剩餘7字節能夠存儲cc,因此係統沒有額外給cc分配內存。cc有了內存後剩餘6字節沒法存儲d,系統就額外爲d分配8字節,整個分配浪費內存6字節。

sizeof(s22)結果是應該是10,可是系統按照sizeof(double)*3分配,因此大小是24,由於和定義順序有關,因此當給c分配8個字節以後,剩餘7個字節沒法存儲d,因此係統又分配了8個字節給d,以後又分配8個本身給cc,分配完後浪費了14個字節的空間。因此,在定義結構體struct 的時候按照s33的順序分配能夠節省內存。

相關文章
相關標籤/搜索