2014-02-06 52 views
2

我閱讀下面的代碼從維基如何在代碼中應用填充?

struct MixedData 
{ 
    char Data1; 
    short Data2; 
    int Data3; 
    char Data4; 
}md; 
printf("%u %u %u %u", &md.Data1, &md.Data2, &md.Data3, &md.Data4); 

的輸出是: -

268624 268626 268628 268632 

我無法理解填充如何在上面的代碼中的每個數據成員之後施加?

回答

1

here

第一元件是char這是一個字節對齊,接着短 INT。短整型是2個字節對​​齊。如果short int元素是在char元素後立即分配的 ,它將從奇數 地址邊界開始。編譯器會在 字符後面插入一個填充字節,以確保短整型將具有2的地址倍數(即2 字節對齊)。

這是你的結構看起來的樣子:

+-------+-------+-------+-------+ 
| Data1 |  |  Data2  | 
+-------+-------+-------+-------+ 
|    Data3    | 
+-------+-------+-------+-------+ 
| Data4 |  |  |  | 
+-------+-------+-------+-------+ 

所以填充從焦炭到short是一個字節=>

268624到268625的數據1,從268625到268626填充到short。 然後268626到268628 short不需要填充,全部對齊到結構的最大類型。

,從同樣的參考

有一種方法以最小化填充。程序員應該在大小

他們增加/減少命令,宣佈該 結構成員,以提高你的結構方式是char Data1; 這樣沒有內存將被浪費的填充後直接放置char Data4;

struct MixedData 
{ 
    char Data1; 
    char Data4; 
    short Data2; 
    int Data3; 

}md; 

printf("%p %p %p %p", &md.Data1,&md.Data4, &md.Data2, &md.Data3); 

0x602270 0x602271 0x602272 0x602274 

基本假設,即編譯器堅持自然對齊的int在x86上

+0

爲什麼只有2個字節在短之前使用不是4? –

+0

但如果我在你的答案中聲明瞭兩個連續的'char',那麼爲什麼不需要填充? –

+0

在這種情況下,你的結構是對齊的,並且不需要填充。你的情況中填充了什麼?在Data1之後添加一個字節以將char對齊。 Data1 + Data4 = 2個字符,2個字符= 2個字節,短兩個字節對齊,不需要額外的填充 – Dabo

0

怎麼樣?

2字節1個字節字符

2 2字節的短信

4個字節用於4字節INT

字節?字節爲1字節字符

真正的問題是:爲什麼?

而這個問題的答案是here, structure padding and packinghere, sizeof != sum (fields)

+0

請告訴我如何在代碼中填充空隙? –

+0

你在代碼中填補空缺是什麼意思? –