結(jié)構(gòu)體內(nèi)存對齊

原文:https://blog.csdn.net/IT_Quanwudi/article/details/80527154

?//結(jié)構(gòu)體大小花履,存在內(nèi)存對齊問題

例如:

①:我們先定義一個結(jié)構(gòu)體A加酵,并將其初始地址設(shè)為100

我們普通認為徙硅,其內(nèi)存申請應(yīng)該這樣申請泳叠,a先申請1個字節(jié)大小空間壤躲,b再申請4個字節(jié)大小空間泼诱,結(jié)構(gòu)體A?共5個字節(jié)苛谷。

如圖:

而實際情況卻非如此:

那我們來看看結(jié)構(gòu)體真正的內(nèi)存申請情況:

因為計算機讀取數(shù)據(jù)時,一般標(biāo)準(zhǔn)化4個4個字節(jié)讀取成箫,所以為了節(jié)約時間展箱,我們浪費3個字符大小的內(nèi)存地址,以空間換取時間蹬昌。

所以我們可以找出規(guī)律計算結(jié)構(gòu)體的大小混驰,以①為例:

②:

結(jié)構(gòu)體大小:和①規(guī)則相同皂贩,②的結(jié)構(gòu)體大小=(1+1)+2+4=8個字節(jié)

結(jié)構(gòu)體內(nèi)存申請情況:

③:

結(jié)構(gòu)體大衅苷ァ:和①②規(guī)則相同,③的結(jié)構(gòu)體大小=(1+1)+2+(1+3)+4 = 12個字節(jié)


結(jié)構(gòu)體內(nèi)存申請情況:

④:

結(jié)構(gòu)體大忻魉ⅰ:本身按照以上規(guī)則婴栽,③的結(jié)構(gòu)體大小應(yīng)該=(1+3)+4+2 = 10個字節(jié)

但是運行后,結(jié)果不匹配辈末,正確答案為12個字節(jié)

?

現(xiàn)在我們來看看看結(jié)構(gòu)體真正的內(nèi)存申請情況:


這是按照以上規(guī)則愚争,畫出來的內(nèi)存圖映皆,看似沒錯,可結(jié)果卻不是12個字節(jié)准脂。


現(xiàn)在我們來考慮一下假設(shè)結(jié)構(gòu)體數(shù)組的存在:


struct ?E ?arr[2];

這時arr[1]的地址可能會出現(xiàn)這種情況:


這時候計算機以標(biāo)準(zhǔn)4個4個讀取時劫扒,會在第三個綠色框框處出現(xiàn)問題,讀取失敗狸膏,不是我們需要的值沟饥。

所以我們?yōu)榱吮苊膺@個情況,我們會給arr[1]結(jié)尾出補上兩個字符湾戳,就不會出現(xiàn)讀取錯誤了贤旷。


結(jié)構(gòu)體內(nèi)存申請情況,如圖:

這時我們回頭看④:我們會發(fā)現(xiàn)結(jié)構(gòu)體大小?=(1+3)+4+2+2 = 12個字節(jié)


我們可以找出規(guī)律計算結(jié)構(gòu)體的大小時避免出現(xiàn)以上問題:

就是在計算出結(jié)構(gòu)體大小時砾脑,用所得值對結(jié)構(gòu)體內(nèi)最大的成員大小取余幼驶,看是否==0;

如果韧衣!=0盅藻,我們給補上一個合適大小的內(nèi)存,讓取余==0?畅铭。


不過在實際工作操作時氏淑,一般會直接在結(jié)構(gòu)體上補上一個空白成員并注釋。

如:

最后我們總結(jié)一下結(jié)構(gòu)體內(nèi)存對齊的規(guī)則:

①:每一行和前面行總和比硕噩,不能被整除假残,則補上。

②:算出總共大小后和單個最大比炉擅,不能被整除辉懒,則補上。


我們結(jié)束前用兩個結(jié)構(gòu)體來驗證我們的對齊規(guī)則谍失。

①:

用對齊規(guī)則來計算:①:4+8=12?眶俩;②:單個最大為int a或者int c都為4個字節(jié),12%4==0快鱼。

結(jié)果正確

將上圖展開仿便,可得:

②:

用對齊規(guī)則來計算:①:8+4=12?;②:單個最大為double a為8個字節(jié)攒巍,

12%8!=0,所以補上4個字節(jié),(12+4)%8==0

結(jié)果為16荒勇,正確柒莉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沽翔,隨后出現(xiàn)的幾起案子兢孝,更是在濱河造成了極大的恐慌窿凤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跨蟹,死亡現(xiàn)場離奇詭異雳殊,居然都是意外死亡,警方通過查閱死者的電腦和手機窗轩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門夯秃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痢艺,你說我怎么就攤上這事仓洼。” “怎么了堤舒?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵色建,是天一觀的道長。 經(jīng)常有香客問我舌缤,道長箕戳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任国撵,我火速辦了婚禮陵吸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卸留。我一直安慰自己走越,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布耻瑟。 她就那樣靜靜地躺著旨指,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喳整。 梳的紋絲不亂的頭發(fā)上谆构,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音框都,去河邊找鬼搬素。 笑死,一個胖子當(dāng)著我的面吹牛魏保,可吹牛的內(nèi)容都是我干的熬尺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼谓罗,長吁一口氣:“原來是場噩夢啊……” “哼粱哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起檩咱,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤揭措,失蹤者是張志新(化名)和其女友劉穎胯舷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绊含,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡桑嘶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躬充。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逃顶。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖麻裳,靈堂內(nèi)的尸體忽然破棺而出口蝠,到底是詐尸還是另有隱情,我是刑警寧澤津坑,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布妙蔗,位于F島的核電站,受9級特大地震影響疆瑰,放射性物質(zhì)發(fā)生泄漏眉反。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一穆役、第九天 我趴在偏房一處隱蔽的房頂上張望寸五。 院中可真熱鬧,春花似錦耿币、人聲如沸梳杏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十性。三九已至,卻和暖如春塑悼,著一層夾襖步出監(jiān)牢的瞬間劲适,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工厢蒜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霞势,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓斑鸦,卻偏偏與公主長得像愕贡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子巷屿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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

  • 例子 定義兩個成員個數(shù)相同(3個成員)且成員類型相同(int固以、char、short)的但是成員順序不同的兩個結(jié)構(gòu)體...
    owl207閱讀 370評論 0 0
  • @[c++|struct] 今天在編程中碰到一個坑攒庵,搞的調(diào)試了半天嘴纺,最后發(fā)現(xiàn)程序中在寫數(shù)據(jù)和讀取數(shù)據(jù)時結(jié)構(gòu)體定義不...
    drybeans閱讀 3,589評論 1 11
  • 轉(zhuǎn)載 結(jié)構(gòu)體對齊詳解 結(jié)構(gòu)體數(shù)據(jù)成員對齊的意義 許多實際的計算機系統(tǒng)對基本類型數(shù)據(jù)在內(nèi)存中存放的位置有限制,它們會...
    erU閱讀 472評論 0 3
  • 1. 基礎(chǔ)知識 1.1浓冒、 基本概念栽渴、 功能 馮諾伊曼體系結(jié)構(gòu)1、計算機處理的數(shù)據(jù)和指令一律用二進制數(shù)表示2稳懒、順序執(zhí)...
    yunpiao閱讀 5,269評論 1 22
  • 實習(xí)期間闲擦,在一次我多維棋興趣課上配課,遇到了這樣一個小孩场梆,他是一個身穿灰色夾克的中班的小男孩墅冷,他上課不喜歡主動...
    14117雅麗閱讀 281評論 0 2