iOS 記憶體分配原則介紹2/2
這是我參與11月更文挑戰的第4天,活動詳情檢視:2021最後一次更文挑戰
上一篇講了記憶體分配原則:iOS 記憶體分配原則介紹1/2
也用了結構體進行了舉例驗證了記憶體分配原則,但是細心的同學如果用類去驗證記憶體分配原則就會發現行不通。。。這是為什麼呢?今天我們就來深入淺出一下~
首先還是把記憶體分配原則貼一下:
ios 記憶體分配原則
-
資料成員對⻬規則:結構(struct)(或聯合(union))的資料成員,第⼀個數據成員放在offset為0的地⽅,以後每個資料成員儲存的起始位置要從該成員⼤⼩或者成員的⼦成員⼤⼩(只要該成員有⼦成員,⽐如說是陣列,結構體等)的整數倍開始(⽐如int為4位元組,則要從4的整數倍地址開始儲存。
-
結構體作為成員:如果⼀個結構⾥有某些結構體成員,則結構體成員要從其內部最⼤元素⼤⼩的整數倍地址開始儲存.(struct a⾥存有struct b,b⾥有char,int ,double等元素,那b應該從8的整數倍開始儲存.)
-
收尾⼯作:結構體的總⼤⼩,也就是sizeof的結果,.必須是其內部最⼤成員的整數倍.不⾜的要補⻬。
然後我用了結構體進行了說明:
下面把結構體中的成員再搬到類中:
然後看下記憶體大小 ``` @interface FirstStruct : NSObject @property (nonatomic, assign) char a; //1位元組 @property (nonatomic, assign) double b; //8位元組 @property (nonatomic, assign) int c; //4位元組 @property (nonatomic, assign) short d; //2位元組 @end
@interface SecondStruct : NSObject @property (nonatomic, assign) double b; //8位元組 @property (nonatomic, assign) int c; //4位元組 @property (nonatomic, assign) char a; //1位元組 @property (nonatomic, assign) short d; //2位元組 @end
FirstStruct first = [FirstStruct new]; first.a = 'a'; first.b = 12.23; first.c = 13; first.d = 24; NSLog(@"firstStruct instance size:%lu alloc size:%lu",class_getInstanceSize(first.class), malloc_size((__bridge const void )(first)));
SecondStruct second = [SecondStruct new]; second.a = 'a'; second.b = 12.23; second.c = 13; second.d = 24; NSLog(@"secondStruct instance size:%lu alloc size:%lu",class_getInstanceSize(second.class), malloc_size((__bridge const void )(second))); ```
列印結果:
2021-11-07 17:21:06.990866+0800 testOC[85185:17320090] firstStruct instance size:24 alloc size:32
2021-11-07 17:21:06.990899+0800 testOC[85185:17320090] secondStruct instance size:24 alloc size:32
為什麼和結構體中同樣的順序,大小卻不一樣呢?
還有一點需要知道,類是有一個isa指標在父類NSObject裡面,而父類屬性肯定是在最前面的,那為什麼在相比於結構體多了isa指標結果還是這樣呢?
哈哈,,讓我來告訴你們吧~~~ 1. 首先,class_getInstanceSize 方法獲取的是物件所需要的記憶體大小,malloc_size方法獲取的是系統最終分配的記憶體大小,為甚麼兩個最終結果不一樣呢,這個最後再說,這裡先看class_getInstanceSize方法獲取的大小是怎麼來的
- class_getInstanceSize 獲取的大小和純結構體的大小不一致的原因有兩方面
- 1.類多了一個isa指標
- 2.在從類屬性列表到類結構體的過程中系統做了優化,系統會根據記憶體分配原則調整結構體中元素的順序,以便將記憶體佔用壓縮到最小
怎麼說呢,簡單說就是系統根據記憶體分配原則優化了類的結構體,使這個類在經過記憶體分配原則後能佔用儘量少的記憶體
有些同學可能不信。。。。
不信的同學可以走了。。。。
哈哈。。。
怎麼證明這個事情呢?
有點口渴了,下篇在介紹吧?好不?