2012-04-26 114 views
0

我正在瀏覽項目中的代碼。C結構中的對齊/填充

以下是結構定義如下:

typedef struct { 
    ULONG gatewayIp; 
    UBYTE status; 
     UBYTE align; 
    UWORD info; 
    ULONG magicTemp; 
    uword stationCode; 
} GatewayStatus; 

我的問題是,爲什麼我們在上面的結構之間對準英寸

我教編譯器負責對齊如下面的鏈接中提到的。 http://vcfaq.mvps.org/lang/11.htm

我概括我的問題,不論上述結構 下,我們有什麼方案,以編程方式對齊,並會做什麼場景編譯器,我們呢?

如果兩臺機器有不同的endian類型,即一個m/c是big endian而另一個是low endian,那麼是否需要填充?

請澄清我的問題。

謝謝!

+0

這個結構來自哪個上下文?它不會發生在使用此結構的二進制轉儲進行I/O的庫中,是嗎? – Cameron 2012-04-26 06:16:37

+0

我認爲這是一個糟糕的例子,因爲它與開發人員決定以這種方式定義這種結構的專用產品有關;也許單詞(2字節)對齊。這與編譯器的改變無關。 – 2012-04-26 06:18:49

+0

如果所有內容都顯示C,那麼C++標記是什麼? – 2012-04-26 06:25:08

回答

0

我會想象它在那裏清楚地表明在那個位置會有一個填充字節。如果有人想在將來添加一個字節字段,這可能會很有用。

另一個scenaria是如果該結構用於沒有對齊要求的系統(對於8位體系結構通常是這種情況),但仍然應該具有與大型機器相同的佈局。在這種情況下,結構定義需要顯式的填充。

0

默認情況下,編譯器對齊數據以獲取最大可對齊字節,這取決於機器。對於linux GCC編譯器默認是做4字節對齊。

如果我們想要對齊8,16,32等...字節,我們需要明確告訴編譯器。