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

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

而圖二這個結(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é)。

圖三就顯而易見了,圓圈即代表內(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.