2013-10-09 56 views
1

我得到56字節爲以下。誰能解釋這是怎麼回事?如何找到sizeof結構?

#include <stdio.h> 

typedef struct how_many_bytes { 
    long s[4]; 
    char c, e; 
    int i[2]; 
    char *d;  
} How_Many_Bytes; 

int main(){  
    printf("%lu ", sizeof(How_Many_Bytes)); 
} 

不是應該(4 * 8)+ 1 + 1 + 2(用於填充)+ 4 + 4 + 8 = 52字節

回答

0

您的分析是正確的,但在char *d成員之前還有一個額外的4字節填充。這是爲了使d成員在一個8字節的邊界上對齊。

pahole輸出了對x86-64這種結構是:

struct how_many_bytes { 
     long int     s[4];     /*  0 32 */ 
     char      c;     /* 32  1 */ 
     char      e;     /* 33  1 */ 

     /* XXX 2 bytes hole, try to pack */ 

     int      i[2];     /* 36  8 */ 

     /* XXX 4 bytes hole, try to pack */ 

     char *      d;     /* 48  8 */ 

     /* size: 56, cachelines: 1 */ 
     /* sum members: 50, holes: 2, sum holes: 6 */ 
     /* last cacheline: 56 bytes */ 
};  /* definitions: 1 */ 

無論你如何重新安排該結構的成員,你將無法在總填充做得比6個字節。成員的大小總和爲50個字節,並且結構成員的最大對齊爲8,因此,即使按照最優順序排列成員,在結構的末端將會有6個字節的填充以圍繞它大小達到8的下一個最大倍數。

+0

很清楚明白。非常感謝。 :) – ivesingh

3

因爲它是一個64位機,所以在您的計算中填充爲6而不是2。您也可以使用%zu打印size_t

+0

因此,直到字符的大小是34字節,然後當它到達int你說它將是6填充,將從40開始,然後48 2個int後?如果是32位機器,那麼整數是從36開始的? – ivesingh

+0

@ user2844889沒錯。 –

+0

4字節的int不需要被填充到8字節的邊界;這裏2個字節是正確的。額外的4個填充字節位於8字節指針對象之前。 – caf