iOS-底層原理:內(nèi)存對齊原理

為什么要內(nèi)存對齊?目的是加快內(nèi)存讀取速度,用空間換時間方式獲得內(nèi)存讀取性能的提高。

本文探討3個問題:
1.內(nèi)存對齊原則和計算。
2.結(jié)構(gòu)體內(nèi)存占用的計算。
3.獲取內(nèi)存大小的方法。

內(nèi)存對齊原則和計算

先介紹內(nèi)存對齊3條原則:
\color{red}{數(shù)據(jù)成員存儲位置整除對?}、\color{red}{結(jié)構(gòu)體作為成員內(nèi)部最大元素大小整數(shù)倍地址開始存儲}\color{red}{結(jié)構(gòu)體sizeOf結(jié)果為內(nèi)部最大成員整數(shù)倍(補齊原則)}

數(shù)據(jù)成員存儲位置整除對?

結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第?個數(shù)據(jù)成員放在offset為0的地?,以后每個數(shù)據(jù)成員存儲的起始位置要從該成員??或者成員的?成員??的整數(shù)倍開始。

計算公式:\color{red}{min(m,n)} m為當(dāng)前開始位置 n為數(shù)據(jù)成員大小
如果滿足m整除n(m%n==0),n就可以從m開始存儲
反之繼續(xù)循環(huán)執(zhí)行m+1換位檢查,直到m能整除n就確定當(dāng)前成員的存儲位置。

結(jié)構(gòu)體作為成員內(nèi)部最大元素大小整數(shù)倍地址開始存儲

如果?個結(jié)構(gòu)?有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從
其內(nèi)部最?元素??的整數(shù)倍地址開始存儲.
(例如:struct a?存有struct b,b?有char,int ,double等元素,那b應(yīng)該從double長度:8的整數(shù)倍開始存儲.)

結(jié)構(gòu)體sizeOf結(jié)果為內(nèi)部最大成員整數(shù)倍(補齊原則)

結(jié)構(gòu)體的總??,也就是sizeof的結(jié)果,.必須是其內(nèi)部最?
成員的整數(shù)倍.不?的要補?。

以下是常用對象大小參考數(shù)據(jù)


image.png

結(jié)構(gòu)體內(nèi)存大小計算和對齊

現(xiàn)象1:兩個內(nèi)部成員相同的結(jié)構(gòu)體排序不一樣,占用內(nèi)存大小不一樣。
struct Struct1 {
    double a;   // size:8  Location:[0,7]  startAt 0
    char b;     // size:1 Location[8]    8%1==0
    int c;      // size:4 Location:[12 ,15]  9%4!=0  從位置12開始滿足12%4==0 
    short d;    // size:2 Location[16,17]  16%2==0
}struct1;
// 內(nèi)部需要的大小為: 17 
// 最大屬性 : 8
// 結(jié)構(gòu)體整數(shù)倍: 24    
//補齊[18~23]需要補齊

struct Struct2 {
    double a;   //size:8  Location:[0,7]  startAt 0
    int b;      //size:4  Location:[8,11]  8%4==0
    char c;     //size:1 Location:[12]   12%1==0
    short d;   //size:2 Location:[14,15]  13%2!=0   14%2==0
}struct2;
// 內(nèi)部需要的大小為: 15
// 最大屬性 : 8
// 結(jié)構(gòu)體整數(shù)倍:16

//打印結(jié)構(gòu)體驗證計算結(jié)果
NSLog(@"%lu-%lu",sizeof(struct1),sizeof(struct2));
image.png

由此現(xiàn)象可以聯(lián)想到通過把\color{red}{結(jié)構(gòu)體成員屬性從大到小進行重排}對內(nèi)存進行優(yōu)化,減少內(nèi)存占用量。

2.關(guān)于結(jié)構(gòu)體中嵌套結(jié)構(gòu)體作為成員內(nèi)存計算(待續(xù)更新)

獲取內(nèi)存大小的操作方式

獲取內(nèi)存大小的三種方式分別是
sizeOf
class_getInstanceSize
malloc_size

sizeof

最終得到的結(jié)果是該數(shù)據(jù)類型占用空間的大小

class_getInstanceSize

獲取類的實例對象所占用的內(nèi)存大小(實例對象中成員變量的內(nèi)存大小)

malloc_size

獲取系統(tǒng)實際分配的內(nèi)存大小

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

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