| 今天看到有一段程序里在struct里面用了個Union,然后就突然想到了struct和Union的區(qū)別,找了些資料后發(fā)現,struct和Union在內存分配的時候有區(qū)別,Union里的數據是公用一塊內存……,所以給其分配的內存總是Union里面所定義的最大類型長度的整數倍。
 而struct里的數據跟Union不一樣,它們不共享一塊內存,他是按照struct里面定義的數據順序來進行分配內存的,但是分配的基本單位(即:每分配一次的量)是struct里面所定義的最長的數據類型的長度。
 舉個形象的例子:
 struct里面定義的數據類型的順序為:
 int a;
 char b;
 double c;
 那個系統(tǒng)分配給這個struct的內存空間是多少呢?
 應該是16!
 為什么呢?因為系統(tǒng)先分配8個字節(jié)用來放int,結果int只需要4個就夠了,然后剩下的4個中的一個可以用來放后面的char,碰到double c時,因為此時的3個字節(jié)不能存下,所以再分配了一個8個字節(jié)來存放double c
 
 試想下如果struct里面定義的數據類型的順序為:
 int a;
 double b;
 char c;
 那個系統(tǒng)分給這個struct的內存空間又是多少呢?
 應該是24!
 知道為什么的吧?系統(tǒng)碰到int分給他8個字節(jié)存放,碰到double時,剩下的4個字節(jié)不足以存放,所以再分配了8個字節(jié),再遇到char c時又分配了8個字節(jié),這樣系統(tǒng)其實是浪費了5個字節(jié)的空間。
 所以在結構體里面最好按照類型從小到大的順序來……
 #include <iostream>
 using namespace std;
 struct A1
 {
 char s;
 double b;
 };
 struct A2
 {
 char s1;
 double b;
 char s;
 };
 struct A3
 {
 char s1;
 char s3;
 double b;
 };
 union B1
 {
 char a;
 double b;
 };
 union B2
 {
 char a;
 char a1;
 double b;
 };
 union B3
 {
 char a;
 double b;
 char a1;
 };
 union B4
 {
 int a[5];
 double b;
 };
 int main()
 {
 cout<<sizeof(A1)<<endl;
 cout<<sizeof(A2)<<endl;
 cout<<sizeof(A3)<<endl;
 cout<<sizeof(B1)<<endl;
 cout<<sizeof(B2)<<endl;
 cout<<sizeof(B3)<<endl;
 cout<<sizeof(B4)<<endl;
 return 0;
 }
 運行結果為:
 16
 24
 16
 8
 8
 8
 24
 |