填充

2011-08-29 129 views
2

我總是假設,因爲他們在這裏http://en.wikipedia.org/wiki/Data_structure_alignment說,「重要的是要注意的是,最後一個成員則以用,使結構的總規模應該是一個多所需的字節數是很重要的任何結構成員」填充

的最大對齊因此,對於這樣的結構,其規模應該在32處理器

typedef struct 
{ 
    double s; /* 8 bytes */ 
    char  c; /* 7 bytes padding at the end of make the total size 8*2 */ 
} structa_t; 

所以我很驚訝的大小是16是12,而不是16! !這是爲什麼 ?有人可以投下一些光嗎?

sizeof(double) = 8 
sizeof(structa_t) = 12 

順便說一句,所以系統信息

$ uname -a 
Linux 2.6.18-8.el5xen #1 SMP Thu Mar 15 21:02:53 EDT 2007 i686 i686 i386 GNU/Linux 
$ gcc --version 
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-52) 
+1

必須的意思是,你已經字節說的位 – jman

+1

也許簡單地'雙'只需要對齊在一個四字節的邊界? – sth

+0

您錯過了關閉'* /'的評論。 –

回答

4

的關鍵措辭是:

...結構的總規模應該是最大對準的任何結構成員的的多...

在您系統中,double的對齊方式爲4,而非8.

如果您等待C1x,則可以使用_Alignof運算符(與sizeof類似)。在您的系統,

sizeof(double) == 8 
_Alignof(double) == 4 

您可以在C89更原始的方式測試比對,

​​

或用宏,

#define alignof(x) offsetof(struct { char a; x b; }, b) 
+0

如果你不能等待C1x,你可以嘗試'#define alignof(type)offsetof(struct {char c; type t;},t)'並且通常會得到一個很好的答案。我不是100%確定它保證工作,但似乎。 –

+0

謝謝。我進一步檢查wiki,就像你說過的那樣:「在Windows上8位字節對齊,在Linux上對齊4字節」。 – Qiulang

+0

@Chris Lutz:我猶豫建議這個選項,因爲我懷疑有些實現不支持它,但我意識到這是一個錯誤。 –

0
及其

因爲你的情況結構對準字邊界(其中一個字= 4個字節)。

+1

@Qiulang:對齊與尺寸不一致。對齊必須平均分配的大小 - 因此對於一個8字節雙,可能比對是1,2,4和8。在你的情況,這顯然是4 – caf

+1

@Qiulang - 閱讀仔細:」 ......共同的最低倍數所有成員的**路線** ......「不是成員的大小,他們的__調度。數據類型可以具有較大的大小,但不需要與該大小完全對齊。在32位體系結構中,由於不會有任何8字節的指令對其進行操作,所以'int64_t'不會獲得任何性能優勢,因爲它對齊到8個字節。所以它只需要4字節對齊。 –

+0

感謝您的評論,正如我在上面提到的那樣:「一個雙字節(八字節)將在Windows上進行8字節對齊,在Linux上進行4字節對齊」。我之前在窗口上測試過,所以我得到了double的對齊方式爲8的印象。而MSDN也證實,http://msdn.microsoft.com/en-us/library/aa296569%28v=vs.60%29的.aspx。所以我錯誤地認爲這也是Linux的情況。 – Qiulang

1

維基百科不是這樣的細節特別可靠的來源。

在這種情況下,結構體中最大項目的大小形成一個(相當硬的)上限,其大小爲整個可能獲得填充的大小 - 但實現可以自由使用較少如果它看起來合適的話,那麼填充比它更好在許多情況下,「N位的」處理器,所述最大填充,可以做任何好用於特定結構將是較小的:1)最大項在結構,或2)的處理器本身的「位數」 (所以對於32位處理器,即使數據項大於32位處理器,您也不需要/不想填充大於32位的邊界)。這裏

+2

不,維基百科的措詞是對的,它只是取決於一個詞。見@ Dietrich的答案。 –