typedef struct structA
{
char C;
double D;
int I;
} structA_t;
此structA_t結構的大小:查找錯位結構的正確大小
的sizeof(char)的+ 7字節的填充+的sizeof(雙)+的sizeof(INT)= 1 + 7 + 8 + 4 = 20字節
但這是錯誤的,正確的是
。爲什麼?
typedef struct structA
{
char C;
double D;
int I;
} structA_t;
此structA_t結構的大小:查找錯位結構的正確大小
的sizeof(char)的+ 7字節的填充+的sizeof(雙)+的sizeof(INT)= 1 + 7 + 8 + 4 = 20字節
但這是錯誤的,正確的是
。爲什麼?
炭= 1字節
雙= 8字節
INT = 4個字節
對準加倍=>
padding char => 1+7
padding double => 8+0
padding int => 4+4
=> 24字節
,或者簡單地說,是最大=> 3(字段數)* 8(最大的大小)= 24的倍數對填充/對齊
爲什麼無處不在你要加倍。如果雙人不在那裏,你的答案是什麼? – gpuguy
@gpuguy正如user694733在他/她的回答中所陳述的那樣,結構將會錯位,並且如果int對齊可以被4而不是8整除。在許多平臺上,將考慮最大的字段,其餘字段與其對齊。不知道你的,你可以嘗試重新構造你的結構爲{char,int,double}並查看填充後的大小是否更小......但是不能確定它是否適用於你的情況 – asalic
@gpuguy處理器是面向字的。你需要知道你的CPU的字大小。從你所描述的是64位。因此,要對數據進行分配,必須通過填充將每個數據帶到64位= 8字節(假設系統上1Byte = 8位,這在所有系統中並非總是如此)。在這種情況下,平臺上的4個字節的int必須填充4個字節。雙倍長度是8字節,因此不需要填充。 –
我的猜測是你係統中的int
的大小是4字節,所以int也必須填充4字節以實現8字節的字大小。
total_size=sizeof(char) + 7 Byte padding + sizeof(double) + sizeof(int) + 4 Bytes padding = 24 Bytes
則很可能是4個字節的填充最後ìnt
後。
如果sizeof(double) == 8
那麼可能alignof(double) == 8
也在您的平臺上。 考慮這種情況:
structA_t array[2];
如果尺寸將只有20,然後將array[1].D
錯位(地址將是被4整除,而不是8所要求的對準)。
@ H2CO3我還沒有很多經驗86。我提到它更像是:*「如果您遇到了這個問題,那麼您的平臺可能會有這種限制(您目前的平臺可能會是什麼)。」* – user694733
好文章:由於雙成員的它迫使一切 http://www.drdobbs.com/cpp/padding-and-rearranging-structure-member/240007649
改爲按8個字節對齊。
如果你想要一個更小的結構,那麼下面的結構只給你16個字節!
typedef struct structA
{
int I;
char C;
double D;
} structA_t;
這是相同的結構和成員的順序在問題... – asalic
對不起,錯字:最後的雙重給了16個字節;重新排序struct成員有所幫助。 – MichaelMoser
可以對齊到8個字節。 – 2013-11-27 09:50:35
額外的'4'爲'int'後面的填充 –
@RajuKundhe爲什麼4後需要int?你能否詳細說明並作爲答案? – gpuguy