內(nèi)存對(duì)齊

先看一個(gè)例子!

Snip20160826_1.png

我們發(fā)現(xiàn)兩個(gè)結(jié)構(gòu)體中存放的是相同類型的三個(gè)數(shù)據(jù),只是順序有所不同,通過(guò)sizeof()函數(shù)計(jì)算出所占字節(jié)數(shù)目也完全不同。
其實(shí)我們?cè)趯W(xué)習(xí)C語(yǔ)言的時(shí)候應(yīng)該已經(jīng)說(shuō)過(guò)這種現(xiàn)象是因?yàn)閮?nèi)存對(duì)齊所導(dǎo)致的矩屁,不過(guò)下面我們來(lái)進(jìn)一步了解下內(nèi)存對(duì)齊的規(guī)則辟宗。

PS:阿里校招的測(cè)評(píng)有一題就是考了這個(gè),見(jiàn)下圖:

Snip20160826_2.png

為什么需要內(nèi)存對(duì)齊

所謂內(nèi)存對(duì)齊吝秕,其實(shí)是為了加快CPU讀取數(shù)據(jù)的速度泊脐,因?yàn)镃PU讀取數(shù)據(jù)是按塊(X64架構(gòu)的計(jì)算機(jī)是8個(gè)字節(jié)為一個(gè)塊)來(lái)讀取的,所以按照一定的對(duì)齊規(guī)則存儲(chǔ)數(shù)據(jù)烁峭,會(huì)大大提高CPU的讀取效率容客。

更多內(nèi)容關(guān)于內(nèi)存對(duì)齊對(duì)性能請(qǐng)參考文章

舉個(gè)例子
在32位系統(tǒng)中,假如一個(gè)int變量在內(nèi)存中的地址是0x00ff42c3,因?yàn)閕nt是占用4個(gè)字節(jié)约郁,所以它的尾地址應(yīng)該是0x00ff42c6缩挑,這個(gè)時(shí)候CPU為了讀取這個(gè)int變量的值,就需要先后讀取兩個(gè)塊鬓梅,分別是0x00ff42c00x00ff42c3和0x00ff42c40x00ff42c7供置,然后通過(guò)移位等一系列的操作來(lái)得到。但是如果編譯器對(duì)變量地址進(jìn)行了對(duì)齊绽快,比如放在0x00ff42c0芥丧,CPU就只需要一次就可以讀取到,這樣的話就加快讀取效率坊罢。

還有就是不同平臺(tái)下的硬件原因续担,一些硬件平臺(tái)只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常活孩,并不是所有的硬件平臺(tái)都能訪問(wèn)任意地址上的任意數(shù)據(jù)的物遇。

內(nèi)存對(duì)齊的規(guī)則

  • 基本數(shù)據(jù)類型對(duì)齊
    基本數(shù)據(jù)類型是按照其類型所占字節(jié)數(shù)來(lái)對(duì)齊的,需要注意的是憾儒,不同平臺(tái)下询兴,有些數(shù)據(jù)類型所占字節(jié)數(shù)是不一樣的,比如

指針類型在64位機(jī)器上占8個(gè)字節(jié)航夺,在32位機(jī)器上則占4個(gè)字節(jié)蕉朵。

  • 結(jié)構(gòu)數(shù)據(jù)類型對(duì)齊
    結(jié)構(gòu)體內(nèi)的各個(gè)數(shù)據(jù)對(duì)齊崔涂。在結(jié)構(gòu)體中的第一個(gè)成員的首地址等于整個(gè)結(jié)構(gòu)體的變量的首地址阳掐,而后的成員的地址隨著它聲明的順序和實(shí)際占用的字節(jié)數(shù)遞增。為了總的結(jié)構(gòu)體大小對(duì)齊冷蚂,會(huì)在結(jié)構(gòu)體中插入一些沒(méi)有實(shí)際意思的字符來(lái)填充(padding)結(jié)構(gòu)體缭保。下面給出規(guī)則:

1、對(duì)于結(jié)構(gòu)的各個(gè)成員蝙茶,第一個(gè)成員位于偏移為0的位置艺骂,以后每個(gè)數(shù)據(jù)成員的偏移量必須是min(#pragma pack())指定的數(shù),這個(gè)數(shù)據(jù)成員的自身長(zhǎng)度) 的倍數(shù)隆夯。
2钳恕、在數(shù)據(jù)成員完成各自對(duì)齊之后别伏,結(jié)構(gòu)(或聯(lián)合)本身也要進(jìn)行對(duì)齊,對(duì)齊將按照min(#pragma pack指定的數(shù)值,結(jié)構(gòu)(或聯(lián)合)最大數(shù)據(jù)成員長(zhǎng)度)進(jìn)行對(duì)齊忧额。

#pragma pack()的預(yù)處理指令可以修改系統(tǒng)默認(rèn)的對(duì)齊數(shù)

總結(jié)

PS:聯(lián)合的大小是聯(lián)合中所占字節(jié)最多的成員
了解完規(guī)則之后厘肮,前面的例子加阿里的題目也就迎刃而解了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睦番,一起剝皮案震驚了整個(gè)濱河市类茂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌托嚣,老刑警劉巖巩检,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異示启,居然都是意外死亡兢哭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門夫嗓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厦瓢,“玉大人,你說(shuō)我怎么就攤上這事啤月≈蟪穑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵谎仲,是天一觀的道長(zhǎng)浙垫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)郑诺,這世上最難降的妖魔是什么夹姥? 我笑而不...
    開(kāi)封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮辙诞,結(jié)果婚禮上辙售,老公的妹妹穿的比我還像新娘。我一直安慰自己飞涂,他們只是感情好旦部,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著较店,像睡著了一般士八。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梁呈,一...
    開(kāi)封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天婚度,我揣著相機(jī)與錄音,去河邊找鬼官卡。 笑死蝗茁,一個(gè)胖子當(dāng)著我的面吹牛醋虏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哮翘,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灰粮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了忍坷?” 一聲冷哼從身側(cè)響起粘舟,我...
    開(kāi)封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佩研,沒(méi)想到半個(gè)月后柑肴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旬薯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年晰骑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绊序。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硕舆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骤公,到底是詐尸還是另有隱情抚官,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布阶捆,位于F島的核電站凌节,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洒试。R本人自食惡果不足惜倍奢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垒棋。 院中可真熱鬧卒煞,春花似錦、人聲如沸叼架。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碉碉。三九已至柴钻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垢粮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工靠粪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜡吧,地道東北人毫蚓。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像昔善,于是被迫代替她去往敵國(guó)和親元潘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 首先通過(guò)一段代碼來(lái)描述內(nèi)存對(duì)齊的現(xiàn)象君仆。 上述代碼打印出來(lái)的結(jié)果為:12,8 為什么相同的結(jié)構(gòu)體翩概,只是交換了變量 a...
    xuyafei86閱讀 2,984評(píng)論 2 15
  • why對(duì)齊? 為了提高尋址效率返咱。計(jì)算機(jī)內(nèi)存是以字節(jié)(Byte)為單位劃分的钥庇,理論上CPU可以訪問(wèn)任意編號(hào)的字節(jié),但...
    傾世無(wú)涯閱讀 553評(píng)論 0 0
  • 回答: (以下大部分都是基于x64編譯器下的windows平臺(tái)的gcc version 5.3.0 (GCC)編譯...
    故事狗閱讀 2,308評(píng)論 2 9
  • 這幾天重新看了C語(yǔ)言的基礎(chǔ)知識(shí)吐句,感覺(jué)內(nèi)存對(duì)齊太重要了,應(yīng)該把它記下來(lái)店读。個(gè)人感覺(jué)內(nèi)存對(duì)齊是為了適應(yīng)數(shù)據(jù)總線的寬度N嗦枢,...
    SDBridge閱讀 249評(píng)論 1 0
  • 文章原文在我的個(gè)人博客 為什么會(huì)有內(nèi)存對(duì)齊? 為了訪問(wèn)未對(duì)齊的內(nèi)存屯断,處理器需要作兩次內(nèi)存訪問(wèn)净宵;而,對(duì)齊訪問(wèn)僅需要一...
    JMLin閱讀 660評(píng)論 0 0