iOS 物件所需記憶體和系統實際開闢記憶體詳解

2021-10-01 13:10:21 字數 2314 閱讀 4985

開始探索

新建people類 任何屬性都不加

@inte***ce people : nsobject

@end

建立物件

people *p = [[people alloc]init];

nslog(@"---class_getinstancesize--%ld",class_getinstancesize(p.class));// 8

這個時候是因為每個類或者類物件都有乙個isa指標

增加乙個屬性

@inte***ce people : nsobject

@property(nonatomic,assign)int age;

@end

再次列印大小

people *p = [[people alloc]init];

nslog(@"---class_getinstancesize--%ld",class_getinstancesize(p.class));// 16

理論上講我們增加了乙個int 型別的age 應該增加4個位元組 列印出來的大小應該是12 但為什麼是16 ?看runtime中的**

oc的對齊函式

uint32_t alignedinstancesize()

size_t instancesize(size_t extrabytes)

static inline uint32_t word_align(uint32_t x)

主要來看 (x + word_mask) & ~word_mask; 這個結果 把巨集定義轉過來就是 (x+7)& ~7 就拿剛才的結果舉例就變成了

(12+7) & ~7轉成二進位制就是

(00001100 + 00000111) & 11111000

就轉成 00010011 & 11111000

結果就是 00010000 就是 16,

再來看class_getinstancesize

size_t class_getinstancesize(class cls)

小結

此時可以看出以屬性來計算大小的時候是以8位元組對齊的 而class_getinstancesize拿到的就是以8位元組對齊的記憶體大小

在來看malloc_size

看看實際上系統分配的記憶體大小 修改people類

@inte***ce people : nsobject

@property(nonatomic,assign)int age;

@property(nonatomic,copy)nsstring *name;

@end

按照上面的規則 8+4+8 class_getinstancesize應該是 24 8位元組對齊

那麼malloc_size 是多少

people *p = [[people alloc]init];

nslog(@"---class_getinstancesize--%ld",class_getinstancesize(p.class));// 24

nslog(@"---class_getinstancesize--%ld",malloc_size(cfbridgingretain(p))); // 32

驚奇的發現malloc_size 是 32。看來蘋果在開闢記憶體的時候還有記憶體對齊 主要來看下面這個演算法

k = (size + nano_regime_quanta_size - 1) >> shift_nano_quantum; // round up and shift for number of quanta

slot_bytes = k << shift_nano_quantum;

把巨集定義替換進去就是

k = (size + 16-1)>>4

slot_bytes = k << 4

比如 剛才的 20 按照這個演算法之後就是

k=(00010100 + 00001111) >>4

k= 00100011 >> 4

k= 00000010

slot_bytes = 00000010<<4

slot_bytes = 00100000 = 32

小結其實結論就是 實際分配記憶體是按照16位元組對齊的 記憶體大小都是16 的倍數。

編譯器優化

舉例來講就是 乙個1位元組的和乙個4位元組的會被放在乙個記憶體段裡節省記憶體 不用再出現1個位元組補7個位元組來對齊。

深入探索c 物件模型 類物件所需記憶體大小討論

class oo object oriented virtual int fun oo virtual int fun oo cpy int a int b int c static int temp int main g 編譯後顯示大小為16,有兩點需要說明 1 static的資料並儲存在類物件裡...

《ios 單個物件的記憶體管理》

記憶體管理原則 配對原則 只要出現了 new,alloc,retain,就一定配對出現乙個release,autorelease。保證 中allo和release成對出現是保證記憶體管理的關鍵。殭屍物件 被系統 的物件我們稱之為殭屍物件。手動記憶體管理研究問題方法 1 野指標操作 指標物件被釋放了之...

系統物件和物件許可權

1.作用 oracle使用許可權來控制使用者對資料的訪問以及使用者所能執行的操作。通過對使用者授予許可權,使用者 能夠在自己的模式或其他使用者的模式中建立 刪除或修改資料庫物件,或者在資料庫中執行某些 特定的操作。許可權可以通過以下兩種方法授予使用者 a.直接將許可權授予使用者 b.首先將許可權授予...