我們都知道在數據類型中,char類型占1個字節,short占2個字節,int占4個字節,long占8個字節等等。
在計算結構體大小時需要考慮其內存布局,結構體在內存中存放是按單元存放的,每個單元多大取決於結構體中最大基本類型的大小,下面我們看幾個例子:
1.
struct A{ char a; int b; short c;}str1;這裡char占1個字節,int占4個字節,short占2個字節,按單元存放如下圖:
1 2 3 4
a b b b b c c
由於a占用了1個字節,b存不下,所以開辟新的單元存放b,然後再開辟新的單元存放c。
從這裡可以看出結構體在內存中是按單元存放的,總占用字節數就是3*4=12。
2.
struct B{ char a; short c; int b;}str2;存放如圖:
1 2 3 4
a c c b b b b
在這裡由於b占用4個字節,而a和c總共才占用3個字節,足夠c存放,所以c存放在a的後面,再開辟新的單元存放b。
此例中占用字節數為2*4=8。
3.
struct c{ char a; char b[2]; char c[4];}str3;存放如圖:
1 2 3 4 5 6 7
a b b c c c c
這裡由於數據類型都為char類型,故不必再開辟新的單元,一行存完。
占用字節數為1*1+2*1+4*1=7。
綜上所述,結構體在內存中存放是按單元存放的,所開辟單元的最大長度取決於占字節最大的數據類型,此外我們可以發現存儲順序對空間的使用率有一定的影響。
從以上三例可以看出,第一種最浪費空間;第三種最節省空間,但全使用相同類型,丟失了字段本生的數據類型,不方便使用;第二種介於第一種和第三種寫法之間,其空間上比較緊湊,同時又保持了結構體中字段的數據類型。大家可以嘗試用sizeof()去深入了解結構體中的按單元存放。