C&C++ 結(jié)構(gòu)體在內(nèi)存中的對齊規(guī)則

本文根據(jù)眾多互聯(lián)網(wǎng)博客內(nèi)容整理后形成,引用內(nèi)容的版權(quán)歸原始作者所有,僅限于學(xué)習(xí)研究使用,不得用于任何商業(yè)用途器虾。

原則一:結(jié)構(gòu)體中元素是按照定義順序一個一個放到內(nèi)存中去的民镜,但并不是緊密排列的。從結(jié)構(gòu)體存儲的首地址開始,每一個元素放置到內(nèi)存中時,它都會認(rèn)為內(nèi)存是以它自己的大小來劃分的,因此元素放置的位置一定會在自己寬度的整數(shù)倍上開始(以結(jié)構(gòu)體變量首地址為0計算)捅僵。

例一, 首先系統(tǒng)會將字符型變量a存入第0個字節(jié)(相對地址盆犁,指內(nèi)存開辟的首地址)命咐;然后在存放整形變量b時,會以4個字節(jié)為單位進(jìn)行存儲谐岁,由于第一個四字節(jié)模塊已有數(shù)據(jù)醋奠,因此它會存入第二個四字節(jié)模塊,也就是存入到4~8字節(jié)伊佃;同理窜司,存放雙精度實型變量c時,由于其寬度為8航揉,其存放時會以8個字節(jié)為單位存儲塞祈,也就是會找到第一個空的且是8的整數(shù)倍的位置開始存儲,此例中帅涂,此例中议薪,由于頭一個8字節(jié)模塊已被占用尤蛮,所以將c存入第二個8字節(jié)模塊。整體存儲示意圖如圖1所示斯议。


image.png

考慮另外一個實例, 例二产捞。

struct X
{
  char a;
  double b;
  int c;
} S2;

在例二中僅僅是將double型的變量和int型的變量互換了位置。測試程序不變哼御,測試結(jié)果卻截然不同坯临,sizeof(S2)=24,不同于我們按照原則一計算出的8+8+4=20恋昼,這就引出了我們的第二原則菲茬。

原則二:在經(jīng)過第一原則分析后吐辙,檢查計算出的存儲單元是否為所有元素中最寬的元素的長度的整數(shù)倍好芭,是焰络,則結(jié)束;若不是矩屁,則補齊為它的整數(shù)倍辟宗。

例二中,我們分析完后的存儲長度為20字節(jié)吝秕,不是最寬元素長度8的整數(shù)倍,因此將它補齊到8的整數(shù)倍空幻,也就是24烁峭。這樣就沒問題了。其存儲示意圖如圖2所示秕铛。


image.png

掌握了這兩個原則约郁,就能夠分析所有數(shù)據(jù)存儲對齊問題了。再來看幾個例子但两,應(yīng)用以上兩個原則來判斷鬓梅。
例三:

struct X
{ 
  double a;
  char b;
  int c;     
} S3;

首先根據(jù)原則一來分析。按照定義的順序谨湘,先存儲double型的a绽快,存儲在第0~7個字節(jié);其次是char型的b紧阔,存儲在第8個字節(jié)坊罢;接下來是int型的c,順序檢查后發(fā)現(xiàn)前面三個四字節(jié)模塊都被占用擅耽,因此存儲在第4個四字節(jié)模塊活孩,也就是第12~15字節(jié)。按照第一原則分析得到16個字節(jié)乖仇,16正好是最寬元素a的寬度8的整數(shù)倍憾儒,因此結(jié)構(gòu)體變量S3所占存儲空間就是16個字節(jié)询兴。存儲結(jié)構(gòu)如圖3所示。


image.png

例四:

struct X
{ 
  double a;
  char b;
  int c;
  char d;   
} S4;

仍然首先按照第一原則分析起趾,得到的字節(jié)數(shù)為8+4+4+1=17诗舰;再按照第二原則補齊,則結(jié)構(gòu)體變量S4所占存儲空間為24阳掐。存儲結(jié)構(gòu)如圖4所示:


image.png

例五:

struct X
{ 
 double a;
 char b;
 int c;
 char d;
 int e; 
} S5;

同樣結(jié)合原則一和原則二分析始衅,可知在S4的基礎(chǔ)上在結(jié)構(gòu)體內(nèi)部變量定義最后加入一個int型變量后,結(jié)構(gòu)體所占空間并未增加缭保,仍為24汛闸。存儲結(jié)構(gòu)示意圖如圖5所示。


image.png

例六:
如果將例五中加入的變量e放到第一個定義的位置艺骂,則情況就不同了诸老。結(jié)構(gòu)體所占存儲空間會變?yōu)?2。其存儲結(jié)構(gòu)示意圖如圖6所示钳恕。

struct X
{ 
  int e;
  double a;
  char b;
  int c;
  char d;
} S6;
image.png

補充:前面所介紹的都是元素為基本數(shù)據(jù)類型的結(jié)構(gòu)體别伏,那么含有指針、數(shù)組或是其它結(jié)構(gòu)體變量或聯(lián)合體變量時該如何呢忧额?

  1. 包含指針類型的情況厘肮。只要記住指針本身所占的存儲空間是4(8)個字節(jié)就行了,而不必看它是指向什么類型的指針睦番。
  2. 結(jié)構(gòu)體作為成員类茂。 如果一個結(jié)構(gòu)里有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從其內(nèi)部最大元素大小的整數(shù)倍地址開始存儲.(struct a里存有struct b,b里有char,int ,double等元素,那b應(yīng)該從8的整數(shù)倍開始存儲.)

參考文檔
結(jié)構(gòu)體在內(nèi)存中的對齊規(guī)則

結(jié)構(gòu)體在內(nèi)存中的對齊規(guī)則
版權(quán)聲明:本文為CSDN博主「QuitePig」的原創(chuàng)文章,遵循CC 4.0 BY-SA 版權(quán)協(xié)議托嚣,轉(zhuǎn)載請附上原文出處鏈接及本聲明巩检。
原文鏈接:https://blog.csdn.net/QuitePig/article/details/7908786

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市示启,隨后出現(xiàn)的幾起案子兢哭,更是在濱河造成了極大的恐慌,老刑警劉巖夫嗓,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迟螺,死亡現(xiàn)場離奇詭異,居然都是意外死亡啤月,警方通過查閱死者的電腦和手機煮仇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谎仲,“玉大人浙垫,你說我怎么就攤上這事。” “怎么了夹姥?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵杉武,是天一觀的道長。 經(jīng)常有香客問我辙售,道長轻抱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任旦部,我火速辦了婚禮祈搜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘士八。我一直安慰自己容燕,他們只是感情好婚度,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝗茁,像睡著了一般醋虏。 火紅的嫁衣襯著肌膚如雪哮翘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天饭寺,我揣著相機與錄音,去河邊找鬼佩研。 笑死,一個胖子當(dāng)著我的面吹牛旬薯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播适秩,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秽荞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扬跋,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后洒试,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡垒棋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年卒煞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叼架。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡畔裕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乖订,到底是詐尸還是另有隱情扮饶,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布垢粮,位于F島的核電站贴届,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜡吧。R本人自食惡果不足惜毫蚓,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昔善。 院中可真熱鬧元潘,春花似錦、人聲如沸君仆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽返咱。三九已至钥庇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咖摹,已是汗流浹背评姨。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萤晴,地道東北人吐句。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像店读,于是被迫代替她去往敵國和親嗦枢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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