為什么要內(nèi)存對(duì)齊?目的是加快內(nèi)存讀取速度,用空間換時(shí)間方式獲得內(nèi)存讀取性能的提高。
本文探討3個(gè)問(wèn)題:
1.內(nèi)存對(duì)齊原則和計(jì)算。
2.結(jié)構(gòu)體內(nèi)存占用的計(jì)算。
3.獲取內(nèi)存大小的方法。
內(nèi)存對(duì)齊原則和計(jì)算
先介紹內(nèi)存對(duì)齊3條原則:
、
、
數(shù)據(jù)成員存儲(chǔ)位置整除對(duì)?
結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第?個(gè)數(shù)據(jù)成員放在offset為0的地?,以后每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置要從該成員??或者成員的?成員??的整數(shù)倍開(kāi)始。
計(jì)算公式: m為當(dāng)前開(kāi)始位置 n為數(shù)據(jù)成員大小
如果滿足m整除n(m%n==0),n就可以從m開(kāi)始存儲(chǔ)
反之繼續(xù)循環(huán)執(zhí)行m+1換位檢查,直到m能整除n就確定當(dāng)前成員的存儲(chǔ)位置。
結(jié)構(gòu)體作為成員內(nèi)部最大元素大小整數(shù)倍地址開(kāi)始存儲(chǔ)
如果?個(gè)結(jié)構(gòu)?有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從
其內(nèi)部最?元素??的整數(shù)倍地址開(kāi)始存儲(chǔ).
(例如:struct a?存有struct b,b?有char,int ,double等元素,那b應(yīng)該從double長(zhǎng)度:8的整數(shù)倍開(kāi)始存儲(chǔ).)
結(jié)構(gòu)體sizeOf結(jié)果為內(nèi)部最大成員整數(shù)倍(補(bǔ)齊原則)
結(jié)構(gòu)體的總??,也就是sizeof的結(jié)果,.必須是其內(nèi)部最?
成員的整數(shù)倍.不?的要補(bǔ)?。
以下是常用對(duì)象大小參考數(shù)據(jù)
結(jié)構(gòu)體內(nèi)存大小計(jì)算和對(duì)齊
現(xiàn)象1:兩個(gè)內(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開(kāi)始滿足12%4==0
short d; // size:2 Location[16,17] 16%2==0
}struct1;
// 內(nèi)部需要的大小為: 17
// 最大屬性 : 8
// 結(jié)構(gòu)體整數(shù)倍: 24
//補(bǔ)齊[18~23]需要補(bǔ)齊
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)體驗(yàn)證計(jì)算結(jié)果
NSLog(@"%lu-%lu",sizeof(struct1),sizeof(struct2));
由此現(xiàn)象可以聯(lián)想到通過(guò)把對(duì)內(nèi)存進(jìn)行優(yōu)化,減少內(nèi)存占用量。
2.關(guān)于結(jié)構(gòu)體中嵌套結(jié)構(gòu)體作為成員內(nèi)存計(jì)算(待續(xù)更新)
獲取內(nèi)存大小的操作方式
獲取內(nèi)存大小的三種方式分別是
sizeOf
class_getInstanceSize
malloc_size
sizeof
最終得到的結(jié)果是該數(shù)據(jù)類型占用空間的大小
class_getInstanceSize
獲取類的實(shí)例對(duì)象所占用的內(nèi)存大?。▽?shí)例對(duì)象中成員變量的內(nèi)存大小)
malloc_size
獲取系統(tǒng)實(shí)際分配的內(nèi)存大小