結構體對齊的具體含義

2021-06-07 00:26:01 字數 2239 閱讀 1063

結構體對齊的具體含義   

關於位元組對齊,這可能是我找到的解釋最為準確的一篇文章了,尤其對於   #pragma pack的解釋.之前看了好幾篇文章,都解釋為是設定預設對齊位元組數.唯有該篇指出是設定位元組對齊時所允許的最大值.經linux下驗證,符合事實.  似乎網上的文章以訛傳訛的情況越來越多了.以至於關於集線器在osi體系中所處的層次居然有3中說法. 

#pragma pack(4)   

class testb   

;   

int   nsize = sizeof(testb);   

這裡nsize結果為12,在預料之中。   

現在去掉第乙個成員變數為如下**:   

#pragma pack(4)   

class testc   

;   

int nsize = sizeof(testc);   

按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?   

事實上,很多人對#pragma pack的理解是錯誤的。   

#pragma pack規定的對齊長度,實際使用的規則是:   

結構,聯合,或者類的資料成員,第乙個放在偏移為0的地方,以後每個資料成員的對齊,按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。   

也就是說,當#pragma pack的值等於或超過所有資料成員長度的時候,這個值的大小將不產生任何效果。   

而結構整體的對齊,則按照結構體中最大的資料成員和#pragma pack指定值之間,較小的那個進行。   

具體解釋   

#pragma pack(4)   

class testb   

;   

這個類實際佔據的記憶體空間是9位元組   

類之間的對齊,是按照類內部最大的成員的長度,和#pragma pack規定的值之中較小的乙個對齊的。   

所以這個例子中,類之間對齊的長度是min(sizeof(int),4),也就是4。   

9按照4位元組圓整的結果是12,所以sizeof(testb)是12。   

如果   

#pragma   pack(2)   

class   testb   

;   

//可以看出,上面的位置完全沒有變化,只是類之間改為按2位元組對齊,9按2圓整的結果是10。   

//所以   sizeof(testb)是10。   

最後看原貼:   

現在去掉第乙個成員變數為如下**:   

#pragma   pack(4)   

class   testc   

;   

//整個類的大小是5位元組,按照min(sizeof(short),4)位元組對齊,也就是2位元組對齊,結果是6   

//所以sizeof(testc)是6。   

感謝   michael   提出疑問,在此補充:   

當資料定義中出現__declspec(   align()   )時,指定型別的對齊長度還要用自身長度和這裡指定的數值比較,然後取其中較大的。最終類/結構的對齊長度也需要和這個數值比較,然後取其中較大的。   

可以這樣理解,   __declspec(   align()   )   和   #pragma   pack是一對兄弟,前者規定了對齊的最小值,後者規定了對齊的最大值,兩者同時出現時,前者擁有更高的優先順序。   

__declspec   (   align()   )的乙個特點是,它僅僅規定了資料對齊的位置,而沒有規定資料實際占用的記憶體長度,當指定的資料被放置在確定的位置之後,其後的資料填充仍然是按照#pragma   pack規定的方式填充的,這時候類/結構的實際大小和記憶體格局的規則是這樣的:   

在__declspec(   align   ()   )之前,資料按照#pragma   pack規定的方式填充,如前所述。當遇到   __declspec(   align()   )的時候,首先尋找距離當前偏移向後最近的對齊點(滿足對齊長度為   max(資料自身長度,指定值)   ),然後把被指定的資料型別從這個點開始填充,其後的資料型別從它的後面開始,仍然按照#pragma   pack填充,直到遇到下乙個__declspec   (   align()   )。   

當所有資料填充完畢,把結構的整體對齊數值和__declspec(   align()   )規定的值做比較,取其中較大的作為整個結構的對齊長度。   

特別的,當__declspec(   align()   )指定的數值比對應型別長度小的時候,這個指定不起作用。

結構體對齊的具體含義( pragma pack)

結構體對齊的具體含義 pragma pack 現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize sizeof testc 按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?事實上,很多人對 pragma pack的理解是錯...

結構體對齊的具體含義( pragma pack)

結構體對齊的具體含義 pragma pack 朋友帖了如下一段 pragma pack 4 class testb int nsize sizeof testb 這裡nsize結果為12,在預料之中。現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize...

結構體對齊的具體含義( pragma pack)

panic2005年4月2日 現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize sizeof testc 按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?事實上,很多人對 pragma pack的理解是錯誤的。pragm...