2012-08-02 134 views
12

據我所知,默認情況下將完成4字節對齊。說爲什麼在這種情況下填充不會發生?

typedef struct 
{ 
    int data7; 
    unsigned char data8; 
    //3 -bytes will be added here. 
}Sample1; 

所以sizeof(Sample1)將是8

但對於以下結構,填充爲什麼沒有發生?

typedef struct 
{ 
    unsigned char data1; 
    unsigned char data2; 
    unsigned char data3; 
    unsigned char data4; 
    unsigned char data5; 
    unsigned char data6; 

}Sample2; 

但的sizeof(樣品2)只有6。這個Sample2不是一個4字節對齊的結構?

EDIT ::

作爲每維基

數據對齊是指將數據以存儲器偏移量等於字尺寸,這提高了系統的性能的某個倍數由於CPU的方式處理內存。

但是Sample2的成員不會以兩個右邊的倍數對齊?

謝謝。

+2

好問題+1 – Angus 2012-08-02 08:11:53

回答

20

第二個結構中的字段都不需要4字節對齊。 unsigned char只需要1字節對齊。因此,不需要將其實際對齊到4個字節。

結構通常只與所有字段的最大對齊對齊。

+9

對於編輯:「字大小」不一定與處理器的原始字大小相同。如果數據類型較小,則可應用較小的字大小。例如,在x86上,在'mod 4!= 0'地址訪問'char'沒有任何性能損失。但是如果你嘗試訪問帶有'mod 4!= 0'的4字節'int',因爲它跨越了4字節的對齊邊界。 – Mysticial 2012-08-02 07:20:29

+1

謝謝@Mystical。很多需要的答案。這就是我要找的。 – Jeyaram 2012-08-02 07:26:34

5

data7是一個4字節的項目,所以編譯器通常會試圖將其調整到這的4

data1倍數的地址是一個字節的項目,所以編譯器不會嘗試將其與任何特定邊界對齊(即,這樣做不會有真正的收益)。

3

不,在典型的實現中Sample2不是4字節對齊的結構。它是一個1字節對齊的結構。

在典型的實現中,整個結構的對齊要求計算爲其各個成員的對齊要求的最大值。這就是爲什麼你的Sample1有(你的平臺上4)int對齊要求,以及你的Sample2unsigned char對齊要求,這是1

1

字符需要1點字節對齊。最大數據類型是char, 這是一個字節對齊,因此您得到的大小爲'6'。

您可以查看本網站以獲得更多瞭解。 http://www.geeksforgeeks.org/archives/9705。 他們詳細解釋了它。

相關問題