看了 VC++中內存對齊 這篇文章,感受說複雜了,根據個人總結,要算出結構體的內存大小和偏移量,只要清楚結構體各成員的內存佈局就好了,下面介紹一下我總結的規則,有不對之處,歡迎回復。 一、實際PACK值根據默認值、聲明值、成員值的最小值獲得。默認值在32位系統中爲4,聲明值則是使用#pragma pack(n)聲明的值,如沒有則忽略,成員最小值則是指結構體中最大的一個數據類型的大小,如int爲4,short爲2...,舉例: #pragma pack(8) struct sta { char a; char b; int c; char d; }; 默認值:4,聲明值:8,成員值:4(最大爲int),所以實際PACK值爲4. 二、除最後一個成員外,每一個成員都根據成員值和實際PACK值中取最小值,偏移到此值的整數倍。如前面的結構體,a無偏移,b爲char,1個字節,與PACK取最小值就是1個字節,所以偏移1個字節,偏移爲1。c爲int,4個字節,與實際PACK值取最小值爲4,所以偏移爲4. 三、最後一個成員若是比實際PACK值小,則補齊到實際PACK值。如前面的結構體,d爲char,1個字節,需補齊爲4個字節,所以偏移爲8。 上述結構體的內存佔12個字節,佈局如圖: 位置:0 1 2 3 4 5 6 7 8 9 10 11 12 成員:a b _ _ c _ _ _ d _ __ __ __ Qq 928900200 木其工做室佈局