2011-08-19 71 views
4

可能重複:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?爲什麼struct的sizeof與其成員之和不同?

如果我實現下面的代碼,我的sizeof的輸出(*拉鍊)是56。 [10 + 10 + 4 + 4 * 8]字節= 56

typedef struct{ 
char a[10]; 
char b[10]; 
int c; 
double d,f,g,h; 
}abc_test; 

abc_test zip[] = 
{ 
    {"Name" ,"Gender", 0,100,200,300,400}, 
    {"Name" ,"Gender", 0,100,200,300,400} 

}; 

但是,當我實現下面的代碼,我的sizeof的輸出(*拉鍊)是440 [100 + 100 + 100 + 100 + 4 + 4 * 8] = 436,我的問題是另一個4在哪裏?

typedef struct{ 
char a[100];  
char b[100]; 
char i[100]; 
char j[100]; 
int c; 
double d,f,g,h; 
}abc_test; 

abc_test zip[] = 
{ 
{"Name" ,"Gender","age","mode", 0,100,200,300,400}, 
{"Name" ,"Gender","age","mode", 0,100,200,300,400} 

}; 
+0

哪個編譯器和操作系統? –

+0

Microsoft Visual Studio 2005(嵌入在鷹測試系統中) – bamboolouie

回答

3

你可能有一個編譯器,一切都對齊到8個字節。

1

允許C實現向結構中添加填充以確保結構的兩個成員都針對目標平臺進行了最佳對齊,因此當它們的數組形成時,結構本身的實例會對齊。

實現選擇的特定對齊可能取決於特定結構的大小以及其成員的類型和佈局。

6

一般的答案是,編譯器可以自由成員之間添加填充物不管出於什麼目的(通常對齊要求)。

具體的答案是,你的編譯器可能是對準double成員8字節邊界上。在不需要填充的第一個示例中。在第二個示例中,它需要在int c成員之後填充4個字節。

0

如果你想讓你的結構更有效地使用#pragma pack(push,1)之前和#pragma pack(pop)之後。如果速度很快,並且可能程度較小,代碼大小將會很高。

http://www.cplusplus.com/forum/general/14659/

相關問題