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

一荚恶、結(jié)構(gòu)體變量在內(nèi)存中存放的位置哩牍,也就是對齊方式界阁,默認(rèn)情況下是由編譯器決定的。如果我們需要對其進(jìn)行更改挂据,可以使用:
#pragma pack(n)
表示將結(jié)構(gòu)體中的成員按n字節(jié)的對齊方式存儲以清;

二、說明

  1. #pragma pack提供數(shù)據(jù)聲明級別的控制崎逃,對定義不起作用
  2. 調(diào)用pack時不指定參數(shù)掷倔,n將被設(shè)定為默認(rèn)值
  3. 一旦改變數(shù)據(jù)類型的alignment,直接效果就是占用memory的減少个绍,但是performance會下降

三勒葱、重要規(guī)則

  1. 復(fù)雜類型中各個成員按照它們被聲明的順序在內(nèi)存中順序存儲浪汪,第一個成員的地址和整個類型的地址相同;
  2. 每個成員分別對齊凛虽,即每個成員按自己的方式對齊死遭,并最小化長度;規(guī)則就是每個成員按其類型的對齊參數(shù)(通常是這個類型的大猩)和指定對齊參數(shù)中較小的一個對齊殃姓;
  3. 結(jié)構(gòu)、聯(lián)合或者類的數(shù)據(jù)成員瓦阐,第一個放在偏移為0的地方蜗侈;以后每個數(shù)據(jù)成員的對齊,按照#pragma pack指定的數(shù)值和這個數(shù)據(jù)成員自身長度兩個中比較小的那個進(jìn)行睡蟋;也就是說踏幻,當(dāng)#pragma pack指定的值等于或者超過所有數(shù)據(jù)成員長度的時候,這個指定值的大小將不產(chǎn)生任何效果戳杀;
  4. 復(fù)雜類型(如結(jié)構(gòu))整體的對齊<注意是“整體”>是按照結(jié)構(gòu)體中長度最大的數(shù)據(jù)成員和#pragma pack指定值之間較小的那個值進(jìn)行该面;這樣在成員是復(fù)雜類型時,可以最小化長度信卡;
  5. 結(jié)構(gòu)整體長度的計算必須取所用過的所有對齊參數(shù)的整數(shù)倍隔缀,不夠補(bǔ)空字節(jié);也就是取所用過的所有對齊參數(shù)中最大的那個值的整數(shù)倍傍菇,因為對齊參數(shù)都是2的n次方猾瘸;這樣在處理數(shù)組時可以保證每一項都邊界對齊

四、實例
在相同的對齊方式下丢习,結(jié)構(gòu)體內(nèi)部數(shù)據(jù)定義的順序不同牵触,結(jié)構(gòu)體整體占據(jù)內(nèi)存空間也不同,
如下: 設(shè)結(jié)構(gòu)體如下定義:
struct A
{
int a;
char b;
short c;
};
結(jié)構(gòu)體A中包含了4字節(jié)長度的int一個咐低,1字節(jié)長度的char一個和2字節(jié)長度的short型數(shù)據(jù)一個揽思。所以A用到的空間應(yīng)該是7字節(jié)。但是因為編譯器要對數(shù)據(jù)成員在空間上進(jìn)行對齊见擦,也就是計算結(jié)構(gòu)整體長度钉汗,根據(jù)上面三中的第5點可知,整體長度就是所有對齊參數(shù)中最大的那個值(int 4字節(jié))的整數(shù)倍鲤屡,此時應(yīng)該為2 * 4 = 8儡湾,所以使用sizeof(strcut A)值為8。
現(xiàn)在把該結(jié)構(gòu)體調(diào)整成員變量的順序执俩。
struct B
{
char b;
int a;
short c;
};
這時候同樣是總共7個字節(jié)的變量徐钠,但是sizeof(struct B)的值卻是12,
地址分配為:b: 0x0000 0000(0x0000 0000), a: 0x0000 0004(0x0000 0004 ~ 0x0000 0007), c: 0x0000 0008(0x0000 0008 ~ 0x0000 0009)役首;計算結(jié)構(gòu)體整體長度尝丐,就是3 * 4 = 12显拜;
下面我們使用預(yù)編譯指令#pragma pack (value)來告訴編譯器,使用我們指定的對齊值來取代缺省的爹袁。

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

#pragma pack () /取消指定對齊,恢復(fù)缺省對齊,等價于#pragma pack(pop)/
sizeof(struct C)值是8失息;地址分配:b: 0x0000 0000譬淳;a: 0x0000 0002(根據(jù)對齊規(guī)則,int自身的對齊長度為4盹兢,使用pack指定為2邻梆,取其中的最小值,也就是2字節(jié)對齊)绎秒;c: 0x0000 0006; 整體長度浦妄。
修改對齊值為1:

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

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

對于char型數(shù)據(jù)剂娄,其自身對齊值為1,對于short型為2玄呛,對于int,float,long類型阅懦,其自身對齊值為4,double,long long類型徘铝,其自身對齊值為8耳胎,單位字節(jié)。

五庭砍、概念
這里面有四個概念值:
1.數(shù)據(jù)類型自身的對齊值:就是上面交代的基本數(shù)據(jù)類型的自身對齊值。
2.指定對齊值:#pragma pack (value)時的指定對齊值value混埠。
3.結(jié)構(gòu)體或者類的自身對齊值:其數(shù)據(jù)成員中自身對齊值最大的那個值怠缸。
4.數(shù)據(jù)成員、結(jié)構(gòu)體和類的有效對齊值:自身對齊值和指定對齊值中小的那個值钳宪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揭北,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吏颖,更是在濱河造成了極大的恐慌搔体,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件半醉,死亡現(xiàn)場離奇詭異疚俱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缩多,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門呆奕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來养晋,“玉大人,你說我怎么就攤上這事梁钾∩” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵姆泻,是天一觀的道長零酪。 經(jīng)常有香客問我,道長拇勃,這世上最難降的妖魔是什么四苇? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮潜秋,結(jié)果婚禮上蛔琅,老公的妹妹穿的比我還像新娘。我一直安慰自己峻呛,他們只是感情好罗售,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钩述,像睡著了一般寨躁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牙勘,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天职恳,我揣著相機(jī)與錄音,去河邊找鬼方面。 笑死放钦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恭金。 我是一名探鬼主播操禀,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼横腿!你這毒婦竟也來了颓屑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤耿焊,失蹤者是張志新(化名)和其女友劉穎揪惦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罗侯,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡器腋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒂培。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡再愈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出护戳,到底是詐尸還是另有隱情翎冲,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布媳荒,位于F島的核電站抗悍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钳枕。R本人自食惡果不足惜缴渊,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鱼炒。 院中可真熱鬧衔沼,春花似錦、人聲如沸昔瞧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽自晰。三九已至凝化,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酬荞,已是汗流浹背搓劫。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留混巧,地道東北人枪向。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像咧党,于是被迫代替她去往敵國和親秘蛔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容