2014-04-30 36 views
1
struct NodeUsingAttribute 
{ 

char cr; 
int data __attribute__((aligned(8))); 

}; 


struct Node 
{ 

char cr; 
int data ; 

}; 

第一個大小爲16,第二個大小爲8,在我的機器上。我無法弄清楚爲什麼16 ?.數據對齊問題

+1

參見例如http://stackoverflow.com/questions/4544372/memory-alignment-attribute-aligned-8 –

回答

4

您的對齊屬性要求data元素位於8字節的邊界上。爲了確保結構數組的所有元素都正確對齊,整個結構必須是8字節對齊的,並且通過將其長16字節來實現。

+0

謝謝喬納森。所以你的意思是,理想情況下,一個實例的大小應該是12.但是,只有數組需要對齊時,編譯器纔會使其16個字節,以便連續的元素被正確對齊 –

+1

結構的大小在編譯時是固定的,禁止靈活的陣列成員不是這個問題的一部分,謝天謝地。因此,大小必須能夠適用於所有情況:作爲單例結構,作爲結構類型數組的元素,作爲另一個結構或聯合的元素。要實現所有這些並且具有單一大小,大小必須爲16個字節('cr'成員1個字節,7個字節填充,'data'成員4個字節,以及4個字節填充)。現在,編譯器可以確保它可以在任何可以使用的地方正確對齊。 –

+1

使用12字節的大小不能保證結構在數組中使用時正確對齊,因爲數組的元素是密集打包的(連續的 - 沒有間隙)。 –