#pragma pack(n)內存地址分配

一、結構體變量在內存中存放的位置,也就是對齊方式,默認情況下是由編譯器決定的。如果我們需要對其進行更改,可以使用:
#pragma pack(n)
表示將結構體中的成員按n字節的對齊方式存儲;

二、說明

  1. #pragma pack提供數據聲明級別的控制,對定義不起作用
  2. 調用pack時不指定參數,n將被設定為默認值
  3. 一旦改變數據類型的alignment,直接效果就是占用memory的減少,但是performance會下降

三、重要規則

  1. 復雜類型中各個成員按照它們被聲明的順序在內存中順序存儲,第一個成員的地址和整個類型的地址相同;
  2. 每個成員分別對齊,即每個成員按自己的方式對齊,并最小化長度;規則就是每個成員按其類型的對齊參數(通常是這個類型的大小)和指定對齊參數中較小的一個對齊;
  3. 結構、聯合或者類的數據成員,第一個放在偏移為0的地方;以后每個數據成員的對齊,按照#pragma pack指定的數值和這個數據成員自身長度兩個中比較小的那個進行;也就是說,當#pragma pack指定的值等于或者超過所有數據成員長度的時候,這個指定值的大小將不產生任何效果;
  4. 復雜類型(如結構)整體的對齊<注意是“整體”>是按照結構體中長度最大的數據成員和#pragma pack指定值之間較小的那個值進行;這樣在成員是復雜類型時,可以最小化長度;
  5. 結構整體長度的計算必須取所用過的所有對齊參數的整數倍,不夠補空字節;也就是取所用過的所有對齊參數中最大的那個值的整數倍,因為對齊參數都是2的n次方;這樣在處理數組時可以保證每一項都邊界對齊

四、實例
在相同的對齊方式下,結構體內部數據定義的順序不同,結構體整體占據內存空間也不同,
如下: 設結構體如下定義:
struct A
{
int a;
char b;
short c;
};
結構體A中包含了4字節長度的int一個,1字節長度的char一個和2字節長度的short型數據一個。所以A用到的空間應該是7字節。但是因為編譯器要對數據成員在空間上進行對齊,也就是計算結構整體長度,根據上面三中的第5點可知,整體長度就是所有對齊參數中最大的那個值(int 4字節)的整數倍,此時應該為2 * 4 = 8,所以使用sizeof(strcut A)值為8。
現在把該結構體調整成員變量的順序。
struct B
{
char b;
int a;
short c;
};
這時候同樣是總共7個字節的變量,但是sizeof(struct B)的值卻是12,
地址分配為:b: 0x0000 0000(0x0000 0000), a: 0x0000 0004(0x0000 0004 ~ 0x0000 0007), c: 0x0000 0008(0x0000 0008 ~ 0x0000 0009);計算結構體整體長度,就是3 * 4 = 12;
下面我們使用預編譯指令#pragma pack (value)來告訴編譯器,使用我們指定的對齊值來取代缺省的。

#pragma pack (2) /*指定按2字節對齊,等價于#pragma pack(push,2)*/ 
      struct C 
      { 
           char   b; 
            int     a; 
           short c; 
      }; 

#pragma pack () /取消指定對齊,恢復缺省對齊,等價于#pragma pack(pop)/
sizeof(struct C)值是8;地址分配:b: 0x0000 0000;a: 0x0000 0002(根據對齊規則,int自身的對齊長度為4,使用pack指定為2,取其中的最小值,也就是2字節對齊);c: 0x0000 0006; 整體長度。
修改對齊值為1:

#pragma pack (1) /*指定按1字節對齊*/ 
struct D
{ 
       char     b;
        int        a; 
       short   c; 
};

#pragma pack () /取消指定對齊,恢復缺省對齊/
sizeof(struct D)值為7。

對于char型數據,其自身對齊值為1,對于short型為2,對于int,float,long類型,其自身對齊值為4,double,long long類型,其自身對齊值為8,單位字節。

五、概念
這里面有四個概念值:
1.數據類型自身的對齊值:就是上面交代的基本數據類型的自身對齊值。
2.指定對齊值:#pragma pack (value)時的指定對齊值value。
3.結構體或者類的自身對齊值:其數據成員中自身對齊值最大的那個值。
4.數據成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中小的那個值。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容