為什么要內(nèi)存對齊?目的是加快內(nèi)存讀取速度,用空間換時間方式獲得內(nèi)存讀取性能的提高。
本文探討3個問題:
1.內(nèi)存對齊原則和計算。
2.結(jié)構(gòu)體內(nèi)存占用的計算。
3.獲取內(nèi)存大小的方法。
內(nèi)存對齊原則和計算
先介紹內(nèi)存對齊3條原則:
、
、
數(shù)據(jù)成員存儲位置整除對?
結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第?個數(shù)據(jù)成員放在offset為0的地?,以后每個數(shù)據(jù)成員存儲的起始位置要從該成員??或者成員的?成員??的整數(shù)倍開始。
計算公式: 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ù)

結(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));

由此現(xiàn)象可以聯(lián)想到通過把對內(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)存大小