首先需要知道內存是按照4字節對齊的,看下面的結構體
typedef struct {
char a;
char b;
int c;
char d;
}ST_TYPE;
內存可以看作長度爲4的挨在一起的格子,首先變量a b,長度爲2,佔用了第一個格子的頭兩個位置;變量c長度爲4,第一個格子已經放不下,只能另起一格,從第二個格子開始放置;然後變量d,第二個格子已經被佔滿,它只能放在第三個格子。由於結構體長度是格子長度的整數倍,因此它佔用了3個格子,所以結構體長度爲12。
再看下面的結構體
#pragma pack(1)
typedef struct {
char a;
char b;
int c;
char d;
}ST_TYPE;
#pragma pack()
此時編譯器強制結構體元素按照1字節對齊,什麼意思呢,就是結構體大小就是元素大小之和,sizeof(ST_TYPE)=7,這樣以犧牲處理器訪問速度爲代價(處理器最喜歡訪問與自己字長對齊的地址的值,一些系統甚至不允許訪問沒有內存對齊的數據),達到壓縮空間的目的,同時方便在不同的平臺之間傳遞數據(不同平臺可能內存格子的大小不一樣,乾脆都按照1字節對齊)