最近一直研究結構體佔用內存空間大小問題,在網上看了很多文章,很多都是有問題的,所以自己總結了一份,已通過驗證,如有問題,請多指教!
編譯器環境: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。對齊主要是方便計算機存儲方便,不改變數據結構。