iOS OC內(nèi)存對齊

今天群里有人面試碰到問oc內(nèi)存對齊的,記錄一波:

圖一.png

圖一這個結(jié)構(gòu)體,占用4個字節(jié)

圖二.png

而圖二這個結(jié)構(gòu)體呢?答案是:4+4+1+1 = 12個字節(jié)

為什么char明明是1個字節(jié),這里卻說是4呢?因?yàn)檫@個結(jié)構(gòu)體里,最長字節(jié)是4字節(jié),即int b,而根據(jù)內(nèi)存對齊原則,char占一個字節(jié),后面還剩3個字節(jié),但是3個字節(jié)裝不下int b,那么char后面接的3個字節(jié)就會成為內(nèi)存碎片,即4個字節(jié),int本身占4個字節(jié),最后char c ,char d,明明是兩個1字節(jié),為什么最后還是12個字節(jié)呢?還是對齊原則,c+d為2字節(jié),后面空出兩個內(nèi)存碎片,但是還是會占滿4字節(jié),所以最后,這個結(jié)構(gòu)體占有的字節(jié)數(shù)量,是12字節(jié)。

圖三.png

圖三就顯而易見了,圓圈即代表內(nèi)存碎片,而內(nèi)存之所以對齊,是為了尋址方便,快速尋址,同樣一個結(jié)構(gòu)體,如果字節(jié)不對齊 站12個字節(jié),如果對齊占8個字節(jié)。
比如typedef struct demo{ char a; int b; char c; }demo 這個結(jié)構(gòu)體占12字節(jié),而typedef struct demo{ int b; char a; char c; }demo 這個結(jié)構(gòu)體占8個字節(jié)。

那么在實(shí)際開發(fā)中,有哪些注意點(diǎn)呢?其實(shí)手機(jī)內(nèi)存現(xiàn)在這么大,對于這幾個字節(jié)也不需要在意,但是還是要保持一個良好的習(xí)慣,比如,寫結(jié)構(gòu)體的時候,占用字節(jié)最多的類型,寫在前面,同時,如果項目對接了一些內(nèi)存很小的硬件,比如藍(lán)牙數(shù)據(jù)傳輸之類的,能優(yōu)化還是要盡量優(yōu)化。還有,結(jié)構(gòu)體最小占用字節(jié)也是4個字節(jié),并且一個結(jié)構(gòu)體占的內(nèi)存數(shù)一定是4的倍數(shù)喲,即使里面只有一個char.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容