大小

2010-08-27 57 views
17

鑑於大小

struct S { 
    SomeType single_element_in_the_struct; 
}; 

是否總是真的

sizeof(struct S) == sizeof(SomeType) 

或者,它可能是依賴於實現的?

回答

13

這通常是這種情況,但不能保證。

任何結構可能在結構的末尾都有未命名的填充字節,但這些通常用於對齊目的,如果只有單個元素,則這不是問題。

+3

如果你只有一個元素,這不是一個問題_ 實際上,爲了對齊/性能的原因,處理結構中的單個元素仍可能被填充。典型的例子是32位系統上的char數組[6],可以用2個附加字節填充爲4個字節(32位)的整數倍。 – mctylr 2010-08-27 14:48:20

+1

@mctylr:如果這種行爲是典型的,我會有點驚訝。數組的元素之間不能有填充,所以'char [6]'將有6個字節的大小,'char [6] [2]'將有12個字節的大小。我沒有看到對齊類型'struct S {char c [6]; };'和它包含的'char [6]'類型的元素不同。 – 2010-08-27 15:04:11

+1

我的意思是把它當作'struct S = {char array [6]; char pad [2];}'由於32位CPU無論如何都要訪問8個字節,如果'struct S'本身在第二個數組'struct S aS []'中,那麼數組中的元素將對齊對齊邊界。我不希望它是常見的,但可能的。我已經看到人們在通過fwrite/write直接將結構寫入二進制文件或網絡套接字時不會假設這種填充,並且它可以並且確實會中斷。 – mctylr 2010-09-03 15:01:41

12

由於結構填充,它不一定是相等的。

section 6.7.2.1 in the C99 standard指出「在結構對象中可能存在未命名的填充,但不在其開始處」。

這被稱爲結構填充。可以添加填充以確保結構在內存中正確對齊。 如果更改其成員的順序,則結構的exakt大小可能會更改。

+1

或者兩段後,「在結構或工會結束時可能會有未命名的填充。」 – 2010-08-27 14:27:47

+0

這不是特別有用,因爲OP標記了C++和C. – Puppy 2010-08-27 14:31:21

+1

但是如果只有一個結構體的成員,填充是否起作用?這是OP的問題,到目前爲止我還沒有發現任何明確的n1256。例如,根據gcc,包含char的單個3元素數組的結構的大小爲3;沒有填充。在數組後面添加一個int,數組的大小是8,因此元素之間有一個填充字節。 – 2010-08-27 19:12:47

1

這取決於你的編譯器的包裝。通常,結構的大小可以被系統的字長整除(例如4字節== 32位)。

所以你會經常有 sizeof(struct S) > sizeof(SomeType)

對於大多數編譯器,你可以使用編譯器編譯指示修改包裝尺寸。 如果您設置了 #pragma pack(1) 那麼尺寸應該相等。

+1

通常它不依賴於包裝。結構的對齊通常被計算爲結構成員的最強對齊。如果所有成員都是字符,那麼在大多數情況下對齊將爲1(不管默認打包)。 – user396672 2010-08-27 14:41:16