2015-01-06 66 views
2

我經歷的講義爲實際編程MIT開放課件用C約結構填充:結構填充的字節對齊 - 具體的例子

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-087-practical-programming-in-c-january-iap-2010/lecture-notes/MIT6_087IAP10_lec07.pdf

在這裏面,我明白了爲什麼以下結構有大小16:

struct foo { 
    short s;    
    union { 
    int i; 
    char c; 
    }u;  
    unsigned int flag_s : 1; 
    unsigned int flag_u : 2; 
    unsigned int bar; 
} 

爲了儘量減少結構的大小,筆者從重新排列最大的領域,以最小的尺寸:

struct foo {    
    union { 
     int i; 
     char c; 
    }u; 
    unsigned int bar;  
    short s; 
    unsigned int flag_s : 1; 
    unsigned int flag_u : 2; 
} 

而作者說結構的大小現在應該是12.但是,在我的Windows 32位機器上,我仍然得到了輸出爲16的結構大小。這是爲什麼?

只有當我移動位域下的'short s'字段時,我得到的結構大小爲12。這是因爲位域必須以4字節邊界爲開始,因爲它是無符號整數?因此,在上面的結構中,在'short s'字段後仍然會有2個字節的填充字節?

回答

0

根據C語言標準,位字段佈局是實現依賴。所以這個結構的大小在作者的機器上是12字節,但在你的機器上是16字節(但是,在講座中他們聲稱它的大小是12字節而沒有指出它是編譯器依賴)是很奇怪的。 。