/********************************************************************* * Author : Samson * Date : 09/21/2013 * Test platform: * #1 SMP Debian 3.7.2-0+kali8 * gcc (Debian 4.7.2-5) 4.7.2 * *******************************************************************/ 前面進行了基本類型的結構體的討論:http://blog.csdn.net/yygydjkthh/article/details/11850735 現在就結構體中有位域的字段時的長度計算: 通過以下的例子可以看出,關於位域的計算和基本類型的值所構成的結構體的長度不是一個算法兒。 測試代碼與結果: #include <stdio.h> #include <stdlib.h> typedef struct BitArea1 { char c:4; int l:30; }BITAREA1; //上面這個結構體的長度為:4bit+30bit=34bit,大於了一個字節(32bit),又因為:對齊規則的第2條:結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。所以此處應該是按照int類型的4字節進行對齊,所以這裡的34bit補充對齊後的空間占用為8個字節; 若是兩個的字段的總和小於等於32bit,那麼此結構體所占用的空間為4個字節: typedef struct BitArea1 { char c:4; int l:20; }BITAREA1; 同理,若是把int類型修改為short類型的,則在兩字段相加的bit數小於等於sizeof(short)=2Byte=16bit的情況下,占用空間應該為2個字節: typedef struct BitArea1 { char c:4; short l:10; }BITAREA1; 若是兩字段相加的bit數大於2Byte=16bit的話則空間占用為4個字節; typedef struct BitArea1 { char c:4; short l:13; }BITAREA1; typedef struct BitArea { int a:1; char b:1; int c; char d:3; char e:5; int f; char g:3; }BITAREA; //以上的結構體的長度應該為:a和b的長度為2bit,又因為a是int類型的,且C是int,按照規則的第一條和第二條,那麼a+b+c=4+4=8,d+e剛好8bit,又因為f為int的,所以d+e+f=4+4=8,而g為3bit,8+8+1=17,又根據第一條規則:結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。最後的結果為20; typedef struct BitAreaBetter { char b:1; char d:3; char e:5; char g:3; int c; int f; int a:1; }BITAREABETTER; //以上的結構體的長度根據前面的總結,同理可得長度應該為:4+4+4+4=16;前面的4個char類型的由於C是int類型的,所以前4個char加起來的2字節的長度應該按4字節來進行補齊; typedef struct BitAreaBest { char b:1; char d:3; char e:5; char g:3; int a:1; int c; int f; }BITAREABEST; //以上的結構體的長度根據前面的總結,同理可得長度應該為:4+4+4=12;前面的4個char類型加上一個int的位域的總和小於一個int類型的大小,所以總的空間占用通過第一條規則補齊為4字節,其後兩個為int類型的為4字節; //存在位域字段的結構體的優化方法為:把位域字段盡量放到一塊; typedef struct BitAreaBest1 { int a:1; int c; int f; char b:1; char d:3; char e:5; char g:3; }BITAREABEST1; //以上結構體的長度其實和BITAREABETTER的一樣,只是把順序調整了一下; int main() { int len, lenBest, lenBett, len01, lenBest01; BITAREA BitArea; BITAREA1 BitArea1; BITAREABETTER BitAreaBetter; BITAREABEST BitAreaBest; BITAREABEST1 BitAreaBest01; len = sizeof(BitArea); lenBett = sizeof(BITAREABETTER); lenBest = sizeof(BitAreaBest); len01 = sizeof(BitArea1); lenBest01 = sizeof(BitAreaBest01); printf("BitArea1 len is %d BITAREABETTER len is %d BitAreaBest len is %d len01 is %d BitAreaBest01 len is %d\n", len, lenBett, lenBest, len01, lenBest01); return 0; } root@quieter:/usr/local/samsonfile/yygytest# ./a.out BitArea1 len is 20 BITAREABETTER len is 16 BitAreaBest len is 12 len01 is 8 BitAreaBest01 len is 16