前言
? ? ? 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、輸入終端命令:?
這里需要注意: :Xcode 工具尘吗,
: 平臺(tái)?
:iOS平臺(tái)逝她,
: 基于什么架構(gòu) 蘋果手機(jī)是基于arm64的,
:重寫oc文件睬捶,
:輸出到那個(gè)文件黔宛,文件名自定義
經(jīng)過操作,我們會(huì)發(fā)現(xiàn)main.m文件目錄下會(huì)多了一個(gè)main.cpp的c++文件擒贸,打開文件我們可以清晰的看到oc代碼底層代碼的實(shí)現(xiàn)
? ? ? ? 通過底層代碼不難發(fā)現(xiàn)對(duì)象的本質(zhì)是臀晃,那么決定一個(gè)對(duì)象在程序中占有多少內(nèi)存是由這個(gè)結(jié)構(gòu)體決定。
? ? ? ? 為了方便下面的探索介劫,我們先了解下常見基本數(shù)據(jù)類型在內(nèi)存占用的空間大小徽惋,以及另外一個(gè)概念。內(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é)李根。