#pragma pack的作用
程序編譯器對變量的存儲帶有一定隨機性,而pragma pack是一種字節對齊方法,采用人為設定的方式將存儲數據按一定格式排布。百科中提到了其一種作用:有的平台每次讀都是從偶地址開始,如果一個int型存放在偶地址開始處,一個讀周期就可以讀出,如果存在奇地址開始處,則需要兩個周期,並且需要對讀出結果高低字節進行拼湊,降低了讀取效率。因此對於這種平台人為對齊數據在偶地址開頭處是有必要的。因為剛接觸,我目前感覺其最大作用就是數據整齊排布后它們的地址排布也十分清晰(尤其是較為復雜固定數據結構),知道一個數據的地址可以推算出其他數據地址,不用再每次都去取地址。
#pragma pack的使用方法
百科里寫的比較復雜,其實一般用起來也就設置一個對齊長度就行了,即:
-
-
{
-
此部分定義的數據進行對齊
-
}
-
#pragma pack對齊數據結構大小的計算方法
網上有的寫的比較復雜,我就總結一下:
(1)首先,實際對齊長度不一定是你設置的對齊長度,應該是實際對齊長度=min(設置對齊長度,數據的最長長度)。什么意思,舉個例子,你設置對齊長度為4,你的數據中包括int型(長度4),那對齊長度就是4;如果你的數據中僅有short(長度2),那么對齊長度就是2,為什么是這樣可以仔細琢磨一下。
(2)保證每一個數據滿足: 不同類型數據都滿足: 首地址%數據長度 = 0
(3)補齊末尾的空間,保證長度對齊,即總長度%實際對齊長度=0
以上有點抽象,舉幾個例子:
-
-
struct test1
-
{
-
int a;
-
char b;
-
short c;
-
char d;
-
};
-
-
(1)數據中最長為int(長度4),設置對齊長度4,因此實際對齊長度4
(2)int首地址0,長度4,0%4=0,沒問題,占據[0,3];char首地址4,長度1,4%1=0沒問題,占據[4];short首地址5,長度2,5%2!=0,因此不行,此處要補空位,short首地址為6,6%2=0,沒問題了,占據[6,7];char首地址8,長度1,8%1=0沒問題,占據[8]。
(3)最后補齊,[9,10,11],使得12%4=0。
因此 sizeof(test1) =12。
-
-
struct test2
-
{
-
int a;
-
char b;
-
short c;
-
char d;
-
};
-
-
這個例子與上一個類似,值得注意的是設置對齊長度為2。按照取最小原則,實際對齊長度為2,因此第三步中10%2=0,即sizeof(test2)=10。
-
-
struct test3
-
{
-
char b;
-
short c;
-
char d;
-
};
-
-