開始探索
新建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.首先將許可權授予...