結構體佔用內存,如何計算

最近一直研究結構體佔用內存空間大小問題,在網上看了很多文章,很多都是有問題的,所以自己總結了一份,已通過驗證,如有問題,請多指教!

編譯器環境:keil 5.0

語言:C


結構體佔用空間計算要點:雙管齊下

1、內部數據對齊

2、整個空間對齊


入題分析:

struct SIZE
{
double a;
int b;
char c;
double d;
};

先不考慮雙管齊下計算SIZE數據佔用空間,double 8個字節,int 4個字節, char 1個字節,所以一共佔用8*2 + 4 + 1 = 21bits但計算機爲了存儲方便,對結構體數據進行補齊處理,如圖所示,塗色部分爲數據真正佔用的空間,第3個數據char只佔用1bit,但分配空間時,給分配了4bits,多餘的3個bits就是爲了給第四個數據對齊使用。

對齊算法:對齊主要看當前數據偏移量,偏移量首地址如果能除進數據佔用空間大小即可表示爲對齊,否則補齊處理。

第一個數據a首地址爲0,數據位8bits,所以第二個數據首地址爲8,可除進第二個數據int型4bits,8 / 4 = 2,所以無需對齊處理,同理,第三個數據也無需處理對齊問題,第四個數據double佔用8 bits,首地址爲13,不可除進8,所以需要對第三個數據進行對齊處理,13補到16即可除進8,所以第三個數據補3bits,第四個數據偏移量爲16,所以整個數據空間爲24 bits,符合雙管齊下1。結構體內部最大數據double佔用8 bits,數據整體佔用24 bits,成倍數關係,所以符合雙管齊下2。所以,24 bits爲SIZE結構體佔用的內存空間。


備註:char型數據雖然分配了4 bits,但數據本身只佔用1 bits。對齊主要是方便計算機存儲方便,不改變數據結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章