我們都知道在數據類型中,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()去深入了解結構體中的按單元存放。
