2014-04-12 60 views
3

這裏是一個C結構的聲明:爲什麼短爲2字節對齊?

struct align 
{ 
    char c; //1 byte 
    short s;//2 bytes 
}; 

在我的環境中,的sizeof(結構對準)是4和填充1個字節是「字符c」和「短S」之間。有人說這是因爲'short'必須是2字節對齊的,所以在'char c'後面寫入1個字節。在32位機器上,我知道'int'最好是4字節對齊,以防止2個存儲器讀取週期,因爲在CPU和存儲器之間的地址總線上發送的地址是4的倍數。但'short'是2個字節,超過4個字節,所以它的地址可能是4個字節單位內的任何字節(除了最後一個字節)。

4的地址的倍數 - > | 0 | 1 | 2 | 3 |我的意思是,'short'可以從0,1或2開始。所有可以通過1個讀週期檢索,不必是0或2.在我的'結構對齊'情況下,'char c'可以爲0,'short s'可以爲1-2,填充可以爲3.

爲什麼2字節長的「short」必須是2字節對齊的?

感謝

更新我的環境: gcc版本4.4.7,i686的,英特爾

+0

你使用什麼編譯器和平臺?你已經設置了哪些編譯器選項? – Dai

+0

這取決於你的編譯器和系統架構。你應該在系統中包含這些細節。在某些系統中,「short」必須有2字節對齊。 –

+1

在許多機器上,當數量爲N字節對齊時,訪問N字節數量(至少對於{1,2,4,8,16}中的N)效率最高。生活就是這樣;習慣它,因爲我懷疑芯片製造商是否會改變它,只是因爲你認爲它不是它應該的樣子。 –

回答

3

這是因爲struct的成員沒有從該類型的單變量差異,從機器的角度來看, 。無論您選擇什麼路線,它都適用於兩者。

例如,如果short是兩字節長的,

struct align 
{ 
    char c; 
    short s; // two-byte word 
}; 

short ss; // two-byte word 

的構件s是2個字節的類型(在IA32例如WORD),完全相同的類型一個「獨立」變量的ss。底層架構認爲它們是一樣的。因此,當涉及到該類型的對齊要求時,它只適用於兩者。

而且,如果在數據末尾添加填充,它可能仍然未對齊。考慮ss的開頭是在4字節邊界的末尾。

+0

是的,我認爲你的解釋是原因。從「獨立」變量的角度來看,2字節對齊保證了一個「短」會使得nevel跨越兩個4字節的提示,並且CPU在32位機器的1個讀取週期內總能得到「short」。 – password636

相關問題