iOS-底層原理之內(nèi)存對(duì)齊(2)

首先來(lái)看個(gè)栗子

#include<stdio.h>

struct CYStruct{
    int a;      //4
    double b;   //8
    char c ;    //1
    short d;    //2
}Mystruct;


int main ()
{
    printf ("===%d==",sizeof(Mystruct);  
    return 0;
}
打印結(jié)果:===24==

我們知道在64位系統(tǒng)中拳亿,int是4字節(jié) double是8字節(jié) char是1字節(jié)对供,short是2字節(jié),加一起不是15字節(jié)么卿城?打印的結(jié)果卻是24字節(jié)。
這就是因?yàn)閮?nèi)存對(duì)齊铅搓,不僅僅是因?yàn)?字節(jié)對(duì)齊瑟押,下面會(huì)講內(nèi)存對(duì)齊的原則。
注:本文討論的內(nèi)容均是在64位系統(tǒng)下星掰。

What?

一多望、首先我們來(lái)認(rèn)識(shí)下什么是內(nèi)存對(duì)齊。

計(jì)算機(jī)中內(nèi)存空間是按照byte劃分的蹋偏,從理論上講似乎對(duì)任何類型的變量的訪問(wèn)可以從任何地址開始,但實(shí)際情況是:在訪問(wèn)特定類型變量的時(shí)候通常在特定的內(nèi)存地址訪問(wèn)至壤,這就需要對(duì)這些數(shù)據(jù)在內(nèi)存中存放的位置有限制威始,各種類型數(shù)據(jù)按照一定的規(guī)則在空間上排列,而不是順序的一個(gè)接一個(gè)的排放像街,這就是對(duì)齊黎棠。

內(nèi)存對(duì)齊是編譯器的管轄范圍。表現(xiàn)為:編譯器為程序中的每個(gè)“數(shù)據(jù)單元”安排在適當(dāng)?shù)奈恢蒙稀?/p>

why镰绎?

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

參考百度百科
1、平臺(tái)原因(移植原因):不是所有的硬件平臺(tái)都能訪問(wèn)任意地址上的任意數(shù)據(jù)的畴栖;某些硬件平臺(tái)只能在某些地址處取某些特定類型的數(shù)據(jù)随静,否則拋出硬件異常。
2、性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對(duì)齊燎猛。原因在于恋捆,為了訪問(wèn)未對(duì)齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問(wèn)重绷;而對(duì)齊的內(nèi)存訪問(wèn)僅需要一次訪問(wèn)沸停。

現(xiàn)在假如沒(méi)有進(jìn)行內(nèi)存對(duì)齊。
如上圖栗子昭卓,如果需要獲取b愤钾,需要在內(nèi)存中多次偏移讀取,才能找到B候醒。如果有內(nèi)存對(duì)齊能颁,現(xiàn)在只要偏移間隔為B所占內(nèi)存的倍數(shù)查找即可。大大減少了查找成員所需要的時(shí)間火焰。

How?

三劲装、內(nèi)存對(duì)齊原則

1:數(shù)據(jù)成員對(duì)?規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第
一個(gè)數(shù)據(jù)成員放在offset為0的地方昌简,以后每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置要
從該成員大小或者成員的子成員大小(只要該成員有子成員占业,比如說(shuō)是數(shù)組,
結(jié)構(gòu)體等)的整數(shù)倍開始(比如int為4字節(jié),則要從4的整數(shù)倍地址開始存
儲(chǔ)纯赎。 min(當(dāng)前開始的位置mn)m=9n=4
9 10 11 12
2:結(jié)構(gòu)體作為成員:如果一個(gè)結(jié)構(gòu)里有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從
其內(nèi)部最大元素大小的整數(shù)倍地址開始存儲(chǔ).(struct a里存有struct b,b
里有char,int ,double等元素,那b應(yīng)該從8的整數(shù)倍開始存儲(chǔ).)
3:收尾工作:結(jié)構(gòu)體的總大小,也就是sizeof的結(jié)果,.必須是其內(nèi)部最大成員的整數(shù)倍.不足的要補(bǔ)?谦疾。

現(xiàn)在我們來(lái)對(duì)著上面的原則算一下上面的栗子

struct CYStruct{
    int a;      //4     [0-3]
    double b;   //8     [8-15]
    char c ;    //1     [16]
    short d;    //2     [18-19]
}Mystruct;      //最大成員內(nèi)存為8字節(jié),必須是8的倍數(shù)犬金,所以補(bǔ)齊是24字節(jié)念恍。

這里附上字節(jié)占用表,當(dāng)然32位和64位還是有區(qū)別的晚顷。
10341599742584_.pic_hd.jpg

總結(jié)

內(nèi)存對(duì)齊就是制定一定的規(guī)則峰伙,用空間換時(shí)間,讓系統(tǒng)更快的獲取所需要的內(nèi)存该默。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞳氓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子栓袖,更是在濱河造成了極大的恐慌匣摘,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裹刮,死亡現(xiàn)場(chǎng)離奇詭異音榜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)捧弃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門赠叼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事梅割∷冢” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵户辞,是天一觀的道長(zhǎng)泌类。 經(jīng)常有香客問(wèn)我,道長(zhǎng)底燎,這世上最難降的妖魔是什么刃榨? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮双仍,結(jié)果婚禮上枢希,老公的妹妹穿的比我還像新娘。我一直安慰自己朱沃,他們只是感情好苞轿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逗物,像睡著了一般搬卒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翎卓,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天契邀,我揣著相機(jī)與錄音,去河邊找鬼失暴。 笑死坯门,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逗扒。 我是一名探鬼主播古戴,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矩肩!你這毒婦竟也來(lái)了现恼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛮拔,失蹤者是張志新(化名)和其女友劉穎述暂,沒(méi)想到半個(gè)月后痹升,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體建炫,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年疼蛾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肛跌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衍慎,靈堂內(nèi)的尸體忽然破棺而出转唉,到底是詐尸還是另有隱情,我是刑警寧澤稳捆,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布赠法,位于F島的核電站,受9級(jí)特大地震影響乔夯,放射性物質(zhì)發(fā)生泄漏砖织。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一末荐、第九天 我趴在偏房一處隱蔽的房頂上張望侧纯。 院中可真熱鬧,春花似錦甲脏、人聲如沸眶熬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娜氏。三九已至,卻和暖如春负乡,著一層夾襖步出監(jiān)牢的瞬間牍白,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工抖棘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茂腥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓切省,卻偏偏與公主長(zhǎng)得像最岗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朝捆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345