2013-11-27 30 views
1
typedef struct structA 
{ 
    char  C; 
    double  D; 
    int   I; 
} structA_t; 

此structA_t結構的大小:查找錯位結構的正確大小

的sizeof(char)的+ 7字節的填充+的sizeof(雙)+的sizeof(INT)= 1 + 7 + 8 + 4 = 20字節

但這是錯誤的,正確的是

。爲什麼?

+0

可以對齊到8個字節。 – 2013-11-27 09:50:35

+5

額外的'4'爲'int'後面的填充 –

+0

@RajuKundhe爲什麼4後需要int?你能否詳細說明並作爲答案? – gpuguy

回答

1

炭= 1字節

雙= 8字節

INT = 4個字節

對準加倍=>

padding char => 1+7 

padding double => 8+0 

padding int => 4+4 

=> 24字節

,或者簡單地說,是最大=> 3(字段數)* 8(最大的大小)= 24的倍數對填充/對齊

+0

爲什麼無處不在你要加倍。如果雙人不在那裏,你的答案是什麼? – gpuguy

+0

@gpuguy正如user694733在他/她的回答中所陳述的那樣,結構將會錯位,並且如果int對齊可以被4而不是8整除。在許多平臺上,將考慮最大的字段,其餘字段與其對齊。不知道你的,你可以嘗試重新構造你的結構爲{char,int,double}並查看填充後的大小是否更小......但是不能確定它是否適用於你的情況 – asalic

+1

@gpuguy處理器是面向字的。你需要知道你的CPU的字大小。從你所描述的是64位。因此,要對數據進行分配,必須通過填充將每個數據帶到64位= 8字節(假設系統上1Byte = 8位,這在所有系統中並非總是如此)。在這種情況下,平臺上的4個字節的int必須填充4個字節。雙倍長度是8字節,因此不需要填充。 –

0

我的猜測是你係統中的int的大小是4字節,所以int也必須填充4字節以實現8字節的字大小。

total_size=sizeof(char) + 7 Byte padding + sizeof(double) + sizeof(int) + 4 Bytes padding = 24 Bytes

2

則很可能是4個字節的填充最後ìnt後。

如果sizeof(double) == 8那麼可能alignof(double) == 8也在您的平臺上。 考慮這種情況:

structA_t array[2]; 

如果尺寸將只有20,然後將array[1].D錯位(地址將是被4整除,而不是8所要求的對準)。

+0

@ H2CO3我還沒有很多經驗86。我提到它更像是:*「如果您遇到了這個問題,那麼您的平臺可能會有這種限制(您目前的平臺可能會是什麼)。」* – user694733

0

好文章:由於雙成員的它迫使一切 http://www.drdobbs.com/cpp/padding-and-rearranging-structure-member/240007649

改爲按8個字節對齊。

如果你想要一個更小的結構,那麼下面的結構只給你16個字節!

typedef struct structA 
{ 
    int   I; 
    char  C; 
    double  D; 
} structA_t; 
+3

這是相同的結構和成員的順序在問題... – asalic

+0

對不起,錯字:最後的雙重給了16個字節;重新排序struct成員有所幫助。 – MichaelMoser