【備注】:在VC++6.0平台,32位系統上運行測試
先看一個例子:
【A】struct student
{
int num;
char name;
double mark;
}
【B】struct student
{
int num;
double mark;
char name;
}
也許大家一看這A,B兩個結構體不是一樣的么想想這個結構體占的字節數?“也許”大家都會以為 A和B結構體所占的字節數都是:sizeof(struct student)=sizeof(char)+sizeof(int)+sizeof(double)=1+4+8=13 個字節,貌似看起來沒有問題,但是實際上呢!!!
所占字節數: 【A】: 16個字節 【B】: 24個字節
怎么會這樣!!!!
【為什么會這樣】:為了提高CPU的存儲速度,VC對一些變量的起始地址做了“對齊”處理。在默認情況下,VC規定各成員變量存放的起始地址相對於結構的起始地址的偏移量必須為該變量的類型所占用的字節數的倍數。
即:
char 偏移量必須為sizeof( char )即1的倍數
各成員變量在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的字節VC會自動填充,填充部分沒有放任何有意義的東西,結構體的總字節大小必須是該結構中占用最大空間的類型所占用的字節數的倍數,所以在為最后一個成員變量申請空間后,還會根據需要自動填充空缺的字節。
先看結構體【A】:int num//偏移量為0,滿足對齊方式,num占用4個字節;char name //因為前面的num占用4個字節,這時分配的地址對於結構的起始地址的偏移量為4,是sizeof(char)=1的4倍,滿足對齊方式,所以char 占用sizeof(char)=1個字節數目,此時給下一個可以分配的地址對於結構體起始地址的偏移量為4+1=5,此時不是下一個sizeof(double)=8的倍數所以不滿足對齊方式,所以VC自動填充3個字節(這三個字節沒有放什么東西),這時下一個可以分配的地址對於結構的起始地址的偏移量為8,剛好是sizeof(double)=8的倍數,所以把存放 mark 在偏移量為8的地方,該成員變量占用sizeof(double)=8個字節;這時整個結構的成員變量已經都分配了空間,總的占用的空間大小為:4+1+3+8=16,剛好為結構的字節邊界數(即結構中占用最大空間的類型所占用的字節數sizeof(double)=8)的倍數,所以沒有空缺的字節需要填充。所以整個結構的大小為:sizeof(struct student)=4+1+3+8=16!********同理可得結構體【B】所占內存的字節數是 24~
運行結果如下圖所示:
【總結】: 結構體大小不一定是內部變量大小的和!!!!!!!