VC中結構體的內存佈局

看了 VC++中內存對齊 這篇文章,感受說複雜了,根據個人總結,要算出結構體的內存大小和偏移量,只要清楚結構體各成員的內存佈局就好了,下面介紹一下我總結的規則,有不對之處,歡迎回復。html

一、實際PACK值根據聲明值、成員值中較小的獲得。聲明值是使用#pragma pack(n)聲明的值,成員值則是指結構體中最大的一個數據類型的大小,如int爲4,short爲2...,若是沒有聲明,實際PACK值就是成員值,舉例:佈局

#pragma pack(8)
struct sta
{
	char a;
	char b;
	int c;
	char d;
};

  聲明值:8,成員值:4(最大爲int),所以實際PACK值取較小者,爲4。假設int換成double,那就是8。spa

二、除最後一個成員外,每一個成員都根據成員值和實際PACK值中取最小值,偏移到此值的整數倍。如前面的結構體,a無偏移,b爲char,1個字節,與PACK取最小值就是1個字節,所以偏移1個字節,偏移爲1。c爲int,4個字節,與實際PACK值取最小值爲4,必須偏移到4的整數倍,所以偏移爲4.htm

三、最後一個成員若是比實際PACK值小,則補齊到實際PACK值。如前面的結構體,d爲char,1個字節,需補齊爲4個字節,偏移爲8。blog

上述結構體的內存佔12個字節,佈局如圖:內存

位置:0 1 2 3 4 5 6 7 8 9 10 11get

成員:a b _ _ c c  c c d _ __ __class

知道內存佈局,實際大小和各成員的偏移天然都清楚了。總結一下就是」取小偏移,補齊PACK「數據類型

不知道爲何教科書爲何不按我這樣教呢?這不是挺簡單的嘛?總結

相關文章
相關標籤/搜索