2011-07-23 42 views
3

爲什麼在第一種情況下不是12? 測試在:gcc和鏗鏘,64位的最新版本的Linux結構在內存大小上有所不同?

struct desc 
{ 
    int** parts; 
    int nr; 
}; 

sizeof(desc); Output: 16

struct desc 
{ 
    int** parts; 
}; 

sizeof(desc); Output: 8

struct desc 
{ 
    int nr; 
}; 

sizeof(desc); Output: 4

回答

7

編譯器允許結構之間添加填充物成員到麥克e處理更高效。該填充因平臺,編譯器版本等而異。這是通過網絡發送structs不可能的事情之一。

您可以使用offsetof找出編譯器在哪裏添加填充。

+3

不是不可能的:那是什麼包裝設計。 –

+0

64位 - > 8字節 - >將4個字節更改爲8個字節 - > 16 –

+3

C標準是不可能的; C標準不包含結構/編譯指示包裝 – user411313

1

正如前面的答案所示,編譯器允許添加填充。這通常是因爲有時硬件要求某些數據類型必須在某些內存邊界上發生。它看起來像你的系統想要把指針放在一個8字節的邊界上。

填充位於結構的末尾,因此struct desc數組中的每個元素仍然位於8字節的邊界上。

相關問題