iOS底層-結(jié)構(gòu)體指針內(nèi)存對(duì)齊


前言

? ? ? iOS開發(fā)中却妨,我們稱萬物皆對(duì)象,對(duì)象的本質(zhì)又是什么呢穆端?項(xiàng)目開發(fā)中我們也常常說到內(nèi)存的分配忠售,程序又是如何為我們的代碼創(chuàng)建的對(duì)象去分配內(nèi)存的呢?下面我們?nèi)ヌ剿鬟@些疑問迄沫。

正文

? ? ? 1稻扬、首先創(chuàng)建一個(gè)項(xiàng)目并創(chuàng)建一個(gè)對(duì)象。為了方便直接在main函數(shù)里面測試羊瘩。

2泰佳、使用終端命令 cd到main.m文件所在目錄

3、輸入終端命令:? \color{red}{xcrun -sdk iphoneos? clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp}

這里需要注意:\color{red}{xcrun} :Xcode 工具尘吗,\color{red}{-sdk}: 平臺(tái)? \color{red}{iphoneos}:iOS平臺(tái)逝她, \color{red}{-arch}: 基于什么架構(gòu) 蘋果手機(jī)是基于arm64的,\color{red}{-rewrite-objc} :重寫oc文件睬捶,\color{red}{-o}:輸出到那個(gè)文件黔宛,文件名自定義

經(jīng)過操作,我們會(huì)發(fā)現(xiàn)main.m文件目錄下會(huì)多了一個(gè)main.cpp的c++文件擒贸,打開文件我們可以清晰的看到oc代碼底層代碼的實(shí)現(xiàn)

? ? ? ? 通過底層代碼不難發(fā)現(xiàn)對(duì)象的本質(zhì)是\color{red}{結(jié)構(gòu)體}臀晃,那么決定一個(gè)對(duì)象在程序中占有多少內(nèi)存是由這個(gè)結(jié)構(gòu)體決定。

? ? ? ? 為了方便下面的探索介劫,我們先了解下常見基本數(shù)據(jù)類型在內(nèi)存占用的空間大小徽惋,以及另外一個(gè)概念\color{red}{內(nèi)存對(duì)齊}。內(nèi)存對(duì)齊是一種提高內(nèi)存訪問速度的策略座韵,CPU在訪問未對(duì)齊的內(nèi)存需要經(jīng)過兩次的內(nèi)存訪問险绘,而對(duì)齊后一次就可以了。內(nèi)存對(duì)齊需要遵循以下原則:

? ? (1)結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員誉碴,第?個(gè)數(shù)據(jù)成員放在offset為0的地?宦棺,以后每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置需從該成員??或者成員的?成員??(如果該成員有?成員,例如數(shù)組翔烁,結(jié)構(gòu)體等)的整數(shù)倍開始(?如int為4字節(jié)渺氧,所以要從4的整數(shù)倍地址開始存儲(chǔ);

? ? (2)若?個(gè)結(jié)構(gòu)?有某些結(jié)構(gòu)體成員蹬屹,則結(jié)構(gòu)體成員要從其內(nèi)部最?元素??的整數(shù)倍地址開始存儲(chǔ)侣背;

? ? (3)結(jié)構(gòu)體的總??白华,也就是sizeof的結(jié)果,必須是其內(nèi)部最?成員的整數(shù)倍贩耐,不?的需要補(bǔ)?弧腥。

? 下面我們先研究一個(gè)案例,分別計(jì)算struct1潮太、struct2管搪、struct1占用內(nèi)存大小

? ? ? ? 為什么struct1和struct2的只是變量的順序有差異,而占用內(nèi)存不一樣呢铡买,這三個(gè)結(jié)構(gòu)體的占用內(nèi)存是怎么計(jì)算出來的呢更鲁?

? ? ? 首先分析struct1,a奇钞、b澡为、c、d依次占8字節(jié)景埃、1字節(jié)媒至、4字節(jié)、2字節(jié)谷徙。那struct1占用的內(nèi)存大小不是a拒啰、b、c完慧、d之和呢谋旦。struct1變量中占用空間最大的是a占8字節(jié),那么struct1占用的空間肯定是8的整數(shù)倍骗随。如果a占用的內(nèi)存地址是從0~7蛤织,b從第8位開始,b又占1字節(jié)且1能被8整除鸿染,那么b的內(nèi)存地址第8位指蚜,c從第9位開始,c占4字節(jié)但是4不能被9整除涨椒,根據(jù)內(nèi)存對(duì)齊原則摊鸡,9后面第12位可被4整除,所以c的內(nèi)存地址是12~15蚕冬,d占2字節(jié)且從16位開始免猾,2能被16整除,所以d的內(nèi)存地址是從16~17囤热,所以struct1內(nèi)部變量地址是從0~17共18個(gè)字節(jié)猎提,根據(jù)內(nèi)存對(duì)齊原則struct1需補(bǔ)齊6個(gè)字節(jié)總共占24個(gè)字節(jié)。

? ? ? 同理struct2中a旁蔼、b锨苏、c疙教、d內(nèi)存地址依次為0~7、8~11伞租、12贞谓、14~15,struct2內(nèi)部變量地址是從0~15共16個(gè)字節(jié)葵诈,16剛好是8的整數(shù)倍裸弦,struct2共占16個(gè)字節(jié)。

? ? ? ? struct3是內(nèi)部嵌套了一個(gè)結(jié)構(gòu)體作喘。同上a理疙、b、c泞坦、d的內(nèi)存地址是從0~15位沪斟,在e內(nèi)存是從16位開始,struct1內(nèi)部最?元素的大小是8字節(jié)暇矫,需要從8的整數(shù)倍位置開始存儲(chǔ),e地址為16~33 共34字節(jié)根據(jù)內(nèi)存對(duì)齊原則需補(bǔ)齊6字節(jié)择吊,struct2共占40字節(jié)李根。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡信或評(píng)論聯(lián)系作者几睛。
  • 序言:七十年代末房轿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子所森,更是在濱河造成了極大的恐慌囱持,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焕济,死亡現(xiàn)場離奇詭異纷妆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晴弃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門掩幢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人上鞠,你說我怎么就攤上這事际邻。” “怎么了芍阎?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵世曾,是天一觀的道長。 經(jīng)常有香客問我谴咸,道長轮听,這世上最難降的妖魔是什么骗露? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蕊程,結(jié)果婚禮上椒袍,老公的妹妹穿的比我還像新娘。我一直安慰自己藻茂,他們只是感情好驹暑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辨赐,像睡著了一般优俘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掀序,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天帆焕,我揣著相機(jī)與錄音,去河邊找鬼不恭。 笑死叶雹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的换吧。 我是一名探鬼主播折晦,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼沾瓦!你這毒婦竟也來了满着?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤贯莺,失蹤者是張志新(化名)和其女友劉穎风喇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缕探,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡魂莫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爹耗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豁鲤。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鲸沮,靈堂內(nèi)的尸體忽然破棺而出琳骡,到底是詐尸還是另有隱情,我是刑警寧澤讼溺,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布楣号,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏炫狱。R本人自食惡果不足惜藻懒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望视译。 院中可真熱鬧嬉荆,春花似錦、人聲如沸酷含。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椅亚。三九已至限番,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呀舔,已是汗流浹背弥虐。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媚赖,地道東北人霜瘪。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像惧磺,于是被迫代替她去往敵國和親粥庄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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