1. 程式人生 > >C++中sizeof(struct)怎麽計算?(轉)

C++中sizeof(struct)怎麽計算?(轉)

color 發現 pre blank str io7 bsp com 說明

struct為空時,大小為1.

1、 sizeof應用在結構上的情況

請看下面的結構:

1 struct MyStruct
2 {
3 double dda1;
4 char dda;
5 int type;
6 };



對結構MyStruct采用sizeof會出現什麽結果呢?sizeof(MyStruct)為多少呢?也許你會這樣求:

sizeof(MyStruct)=sizeof(double) sizeof(char) sizeof(int)=13

但是當在VC中測試上面結構的大小時,你會發現sizeof(MyStruct)為16。你知道為什麽在VC中會得出這樣一個結果嗎?

其 實,這是VC對變量存儲的一個特殊處理。為了提高CPU的存儲速度,VC對一些變量的起始地址做了”對齊”處理。在默認情況下,VC規定各成員變量存放的 起始地址相對於結構的起始地址的偏移量必須為該變量的類型所占用的字節數的倍數。下面列出常用類型的對齊方式(vc6.0,32位系統)。

類型
對齊方式(變量存放的起始地址相對於結構的起始地址的偏移量)

Char
偏移量必須為sizeof(char)即1的倍數

int
偏移量必須為sizeof(int)即4的倍數

float
偏移量必須為sizeof(float)即4的倍數

double
偏移量必須為sizeof(double)即8的倍數



Short
偏移量必須為sizeof(short)即2的倍數


各 成員變量在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的字節VC會自動填充。同時VC為了確保結構的大小為結 構的字節邊界數(即該結構中占用最大空間的類型所占用的字節數)的倍數,所以在為最後一個成員變量申請空間後,還會根據需要自動填充空缺的字節。

下面用前面的例子來說明VC到底怎麽樣來存放結構的。

1 struct MyStruct
2 {
3 double dda1;
4 char dda;
5 int type;
6 };


為 上面的結構分配空間的時候,VC根據成員變量出現的順序和對齊方式,先為第一個成員dda1分配空間,其起始地址跟結構的起始地址相同(剛好偏移量0剛好 為sizeof(double)的倍數),該成員變量占用sizeof(double)=8個字節;接下來為第二個成員dda分配空間,這時下一個可以分 配的地址對於結構的起始地址的偏移量為8,是sizeof(char)的倍數,所以把dda存放在偏移量為8的地方滿足對齊方式,該成員變量占用 sizeof(char)=1個字節;接下來為第三個成員type分配空間,這時下一個可以分配的地址對於結構的起始地址的偏移量為9(8+1),不是sizeof (int)=4的倍數

,為了滿足對齊方式對偏移量的約束問題,VC自動填充3個字節(這三個字節沒有放什麽東西),這時下一個可以分配的地址對於結構的起 始地址的偏移量為12(8+1+3),剛好是sizeof(int)=4的倍數,所以把type存放在偏移量為12的地方,該成員變量占sizeof(int)=4個 字節;這時整個結構的成員變量已經都分配了空間,總的占用的空間大小為:8 1 3 4=16,剛好為結構的字節邊界數(即結構中占用最大空間的類型所占用的字節sizeof(double)=8)的倍數,所以沒有空缺的字節需要填充。 所以整個結構的大小為:sizeof(MyStruct)=8+1+3+4=16,其中有3個字節是VC自動填充的,沒有放任何有意義的東西。

下面再舉個例子,交換一下上面的MyStruct的成員變量的位置,使它變成下面的情況:
1 struct MyStruct
2 {
3 char dda;
4 double dda1;
5 int type;
6 };


這個結構占用的空間為多大呢?在VC6.0環境下,可以得到sizeof(MyStruc)為24。結合上面提到的分配空間的一些原則,分析下VC怎麽樣為上面的結構分配空間的。(簡單說明)

 1 struct MyStruct
 2 {
 3 char dda; //偏移量為0,滿足對齊方式,dda占用1個字節;
 4  
 5   double dda1; //下一個可用的地址的偏移量為1,不是sizeof(double)=8的倍數,需要補足7個字節才能使偏移量
 6 //變為8(滿足對齊方式),因此VC自動填充7個字節,dda1存放在偏移量為8的地址上,它占用8個字節。
 7  
 8   int type;//下一個可用的地址的偏移量為16,是sizeof(int)=4的倍數, 
 9 //滿足int的對齊方式,所以不需要VC自動填充,type存放在偏移量為16的地址上,它占用4個字節。
10  
11 }; //所有成員變量都分配了空間,空間總的大小為1+7+8+4=20,不是結構的節邊界數(即結構中占用最大空間的類型所占用
12 //的字節數sizeof (double)=8)的倍數,所以需要填充4個字節,以滿足結構的大小為sizeof(double)=8的倍數。



所以該結構總的大小為:sizeof(MyStruc)為1+7+8+4+4=24。其中總的有7+4=11個字節是VC自動填充的,沒有放任何有意義的東西。

轉自:http://www.cnblogs.com/lazycoding/archive/2011/03/22/sizeof-struct.html

C++中sizeof(struct)怎麽計算?(轉)