一般的pack對齊格式分別是1,2,4,8,16.
默認的對齊格式,也就是:#pragma pack()
情況下,會在結構體中挑選佔用字節最多的類型,例如double 佔用8個字節,例子:
#pragma pack()
struct A
{
char c;
char c1;
int a;
double d;
};
上面的結構體長度是16.爲什麼是16,而不是char 8 int 8 double 8
實際上,當我們採用默認的對齊,決定存儲的長度是8個字節,所以每8個字節爲一組,存放數據,但是可能像上面的情況是一個字節的字符,佔用了1個字節的存儲空間,編譯器嘗試利用剩餘的7個空,避免讀取寄存器數值 的時候,從奇數的位置開始讀取數據。所以跳過了一個1個字節。發現下一個元素剛好可以填充從第3個字節開始的位置,所以填充。現在位置移動到了第5個字節,還剩下4個字節,這一組就分配完畢了,此時遇到了一個整型,剛剛好。
如果指定了字節對齊的個數,情況就會不一樣:
#pragma pack(1)
struct A
{
char c;
char c1;
int a;
double d;
};
變成了14個字節。
總結如下:如果沒有指定字節對齊,挑選字節長度最長的類型作爲對齊的字節數。然後分配對齊字節數的空間,嘗試將結構體的成員,往裏面塞,注意存在的開始地址必須是偶數。