iOS雜湊表快取窺探
1.
2. 雜湊表(雜湊表)是以空間換時間.
剛開始為cache_t
分配一定的記憶體, 如10, 當記憶體不夠用時, 記憶體擴大2倍, 依次類推
3. 表格大概如下:
左邊是索引, 右邊是
bucket_t
結構體如上圖所示,
bucket_t
包括_key
與IMP, _key
就是SEL
4.iOS arm64
雜湊表儲存原理:
- 初始時, 為物件的
cach_t
分配一個空間, 值為NULL
- 初始時, 為物件的
- 呼叫方法時, 為物件傳送一個
SEL
訊息, 如@selector(personTest)
, 將這個方法快取
- 呼叫方法時, 為物件傳送一個
- 系統用
SEL
與_mask
作按位與計算:@selector(personTest) & _mask
, 假設其值==2,
- 系統用
- 檢查索引2 對應的空間是否為
NULL
, 如果為NULL
就將這個bucket_t
快取在索引2對應空間
- 檢查索引2 對應的空間是否為
- 如果不為空, 索引減1, 再檢查是否為
NULL
, 依次類推. 如果索引<0, 則使索引 =_mask
- 1, 直至找到索引對應空間為NULL
, 再快取
- 如果不為空, 索引減1, 再檢查是否為
5. 對應的查詢步驟:
- 呼叫方法時, 為物件傳送一個
SEL
訊息, 如@selector(personTest)
- 呼叫方法時, 為物件傳送一個
- 系統用
SEL
與_mask
作按位與計算:@selector(personTest) & _mask
, 假設其值==2,
- 系統用
- 得到索引2 的
bucket_t
, 判斷其中的SEL
是否與傳過來的SEL
相同, 如果相同, 這個_imp
就是尋找的方法
- 得到索引2 的
- 如果不相同, 索引減1, 再比較
SEL
, 依次類推. 如果索引<0, 則使索引 =_mask
- 1, 直至找到_imp
- 如果不相同, 索引減1, 再比較
6. 為什麼按位&_mask
?
按位與 可保證得到的值 <= _mask
, 這樣就不會超出分配的空間.
注: 有的系統是求餘 %, 如java, 這樣也能保證 <= _mask
7. 為什麼有 -1 的演算法, 也是因為按位與, 因為不同的值 & _mask
, 可能結果相同. 如果已經被佔了, 就-1:
8. 如果空間超出原來的_mask
, 則 _mask *= 2
.
每一次_mask
擴容, 雜湊表清空, 只留下一個方法佔用, 是導致它擴容的方法.
- 原始碼:
- 例項:
9.列印雜湊表:
- 可看到有的空間為
NULL
- 可看到有的空間為
10. 測試 & _mask
得到方法:
列印:
注: selector
轉化成數字型別才能 &
, 所以強轉成 long long
.
11. 將地址 轉化 成方法名:
相關文章
- 資料結構 - 雜湊表,再探資料結構
- 雜湊表(雜湊表)詳解
- 坑系列 —— 快取 + 雜湊 = 高併發?快取
- 雜湊表(雜湊表)原理詳解
- 雜湊表
- 資料結構與演算法——雜湊表類的C++實現(探測雜湊表)資料結構演算法C++
- 【尋跡#3】 雜湊與雜湊表
- 字串雜湊表字串
- 6.7雜湊表
- 查詢(3)--雜湊表(雜湊查詢)
- LRU快取-實現雜湊連結串列結合快取
- 深入理解雜湊表(JAVA和Redis雜湊表實現)JavaRedis
- 資料結構 - 雜湊表,三探之程式碼實現資料結構
- 雜湊表應用
- 雜湊表的原理
- 實現雜湊表
- 淺談雜湊表
- 符號表與雜湊表符號
- 幾道和雜湊(雜湊)表有關的面試題面試題
- R語言——雜湊表R語言
- JAVA 實現 - 雜湊表Java
- 【閱讀筆記:雜湊表】Javascript任何物件都是一個雜湊表(hash表)!筆記JavaScript物件
- 雜湊技術【雜湊表】查詢演算法 PHP 版演算法PHP
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法
- [M設計+雜湊表] lc380. 常數時間插入、刪除和獲取隨機元素(設計+雜湊表)隨機
- 資料結構——雜湊表資料結構
- freeswitch APR庫雜湊表
- 談談面試--雜湊表系列面試
- 雜湊表(Hash)的應用
- 資料結構之「雜湊表」資料結構
- 雜湊表的兩種實現
- 從Dictionary原始碼看雜湊表原始碼
- 雜湊表知識點小結
- 演算法學習-雜湊表演算法
- PHP雜湊表碰撞攻擊原理PHP
- 資料結構 - 雜湊表,初探資料結構
- 雜湊表hashtable課堂筆記筆記
- iOS窺探KVO底層實現實戰篇iOS