iOS - Objective-C 底層實現中的哈希表

1. 關聯對象存儲(AssociationsHashMap)

// 關聯對象的哈希表實現
typedef DenseMap<const void *, ObjcAssociation> ObjectAssociationMap;
typedef DenseMap<DisguisedPtr<objc_object>, ObjectAssociationMap> AssociationsHashMap;class AssociationsManager {static AssociationsHashMap *_map;  // 全局關聯對象表void set(id object, const void *key, id value) {// 雙層 map:對象 -> (key -> value)AssociationsHashMap::iterator i = _map->find(object);if (i != _map->end()) {ObjectAssociationMap &refs = i->second;refs[key] = ObjcAssociation(value);}}
};// 特點:
// 1. 雙層哈希表結構
// 2. 使用 DenseMap 實現
// 3. 支持動態擴容

注意事項:

  • 需要考慮內存開銷
  • 多層查找可能影響性能
  • 需要正確管理關聯對象的生命周期

2. 引用計數表(RefcountMap)

// SideTable 中的引用計數表
class SideTable {RefcountMap refcnts;  // 存儲對象的引用計數void retain(id obj) {RefcountMap::iterator it = refcnts.find(obj);if (it != refcnts.end()) {it->second += SIDE_TABLE_RC_ONE;}}
};typedef objc::DenseMap<DisguisedPtr<objc_object>, size_t> RefcountMap;// 特點:
// 1. 使用 DenseMap 實現
// 2. Key 使用偽裝指針
// 3. 需要頻繁訪問和修改

注意事項:

  • 需要保證原子性操作
  • 性能要求高
  • 內存管理要謹慎

3. 弱引用表(weak_table_t)

// 弱引用哈希表
struct weak_table_t {weak_entry_t *weak_entries;  // 哈希數組size_t num_entries;          // 實際條目數uintptr_t mask;             // 容量掩碼uintptr_t max_hash_displacement; // 最大哈希偏移weak_entry_t *get(id referent) {// 使用哈希查找size_t begin = hash_pointer(referent) & mask;size_t index = begin;size_t hash_displacement = 0;while (weak_entries[index].referent != referent) {index = (index + 1) & mask;if (index == begin) break;hash_displacement++;}return &weak_entries[index];}
};// 特點:
// 1. 開放尋址法處理沖突
// 2. 使用線性探測
// 3. 記錄最大偏移量

注意事項:

  • 需要控制裝載因子,避免性能下降
  • 刪除元素時需要特殊處理,避免破壞探測鏈
  • 擴容時需要重新哈希所有元素

4. 方法緩存(cache_t)

// 類的方法緩存
struct cache_t {struct bucket_t *_buckets;  // 哈希表mask_t _mask;              // 容量掩碼mask_t _occupied;          // 已使用數量IMP imp(SEL sel) {// 使用哈希查找方法實現bucket_t *b = buckets();mask_t m = mask();return findMethod(b, m, sel);}
};// 特點:
// 1. 采用散列函數直接尋址
// 2. 緩存最近使用的方法
// 3. 固定大小,滿了就清空重建

注意事項:

  • 緩存滿時會清空重建,而不是擴容
  • 性能敏感,需要快速查找
  • 線程安全問題需要特別注意

5. 性能優化

// 使用 DenseMap 優化內存使用
template <typename T, typename U, typename V>
class DenseMap {// 1. 開放尋址法處理沖突pair<iterator, bool> insert(const T& key, const U& value) {// 查找空位置unsigned index = findEmptyBucket(key);// 插入數據Buckets[index] = make_pair(key, value);}// 2. 自動擴容void grow() {unsigned NewSize = size() * 2;rehash(NewSize);}
};

6. 使用特點

6.1?線程安全

// 訪問 map 時加鎖保護
spinlock_t& lock = SideTables()[obj].lock;
lock.lock();
// 操作 map
lock.unlock();

6.2 內存管理

// 定期清理
void cleanup() {// 遍歷并清理無效條目for (iterator it = map.begin(); it != map.end();) {if (it->second.expired()) {it = map.erase(it);} else {++it;}}
}

6.3 哈希優化

// 優化的哈希函數
static inline uint32_t ptr_hash(const void *key) {uintptr_t k = (uintptr_t)key;return (uint32_t)(k ^ (k >> 7));
}

主要使用場景總結:

  1. 關聯對象存儲
  2. 引用計數管理
  3. 弱引用表實現
  4. 方法緩存
  5. 性能優化

使用特點:

  1. 多采用 DenseMap 實現
  2. 注重性能優化
  3. 考慮線程安全
  4. 自動內存管理
  5. 哈希沖突處理

7. 實現差異

7.1 沖突處理

// 開放尋址法
void insert(Key key, Value value) {size_t index = hash(key) & mask;while (table[index] != empty) {index = (index + 1) & mask;  // 線性探測}table[index] = value;
}// 鏈地址法
void insert(Key key, Value value) {size_t index = hash(key) & mask;table[index].push_back(value);  // 添加到鏈表
}

7.2 擴容策略

// weak_table_t 的擴容
void grow() {// 當使用率超過 3/4 時擴容if (num_entries >= capacity * 3/4) {resize(capacity * 2);}
}// cache_t 的重建
void rebuild() {// 緩存滿時直接清空重建clear();allocate(capacity);
}

7.3 內存管理

// DenseMap 的內存管理
template <typename Key, typename Value>
class DenseMap {// 使用連續內存pair<Key, Value> *Buckets;// 自動擴容void grow() {reallocate(NumEntries * 2);}
};

8. 性能考慮

8.1?查找效率

// 方法緩存優化
IMP cache_t::imp(SEL sel) {// 使用位運算優化mask_t index = (mask_t)(uintptr_t)sel & _mask;return _buckets[index].imp();
}

8.2 空間效率

// weak_table_t 的空間優化
struct weak_entry_t {union {struct {weak_referrer_t *referrers;      // 動態數組};struct {weak_referrer_t  inline_referrers[WEAK_INLINE_COUNT]; // 內聯存儲};};
};

總結:

  1. 不同場景選擇不同的哈希表實現
  2. 需要權衡時間和空間效率
  3. 要考慮線程安全問題
  4. 注意內存管理和性能優化
  5. 合理處理哈希沖突
  6. 選擇適當的擴容策略

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66150.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66150.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66150.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

兩分鐘解決 :![rejected] master -> master (fetch first) , 無法正常push到遠端庫

目錄 分析問題的原因解決 分析問題的原因 在git push的時候莫名遇到這種情況 若你在git上修改了如README.md的文件。由于本地是沒有README.md文件的&#xff0c;所以導致 遠端倉庫git和本地不同步。 將遠端、本地進行合并就可以很好的解決這個問題 注意&#xff1a;直接git pu…

Ubuntu Server 24.04 配置靜態IP

Ubuntu Server 24.04 配置靜態IP 提示&#xff1a;基于Ubuntu Server 24.04進行配置 文章目錄 Ubuntu Server 24.04 配置靜態IP一、查看網卡信息二、修改網卡信息三、使網卡配置生效四、測試 一、查看網卡信息 使用命令 ip a lo 為本地回環地址 ens33 真實網卡地址 shanfengubu…

微服務之松耦合

參考&#xff1a;https://microservices.io/post/architecture/2023/03/28/microservice-architecture-essentials-loose-coupling.html There’s actually two different types of coupling: runtime coupling - influences availability design-time coupling - influences…

Django 和 Vue3 前后端分離開發筆記

Django 和 Vue3 前后端分離開發筆記 1. Django Ninja API Django Ninja 是一個用于使用 Django 和 Python 3.6 類型提示構建 API 的網絡框架。它具有以下主要特點&#xff1a; 簡單易懂&#xff1a;設計為易于使用和符合直覺&#xff0c;適合快速上手。快速執行&#xff1a;…

44_Lua迭代器

在Lua中,迭代器是一種用于遍歷集合元素的重要工具。掌握迭代器的使用方法,對于提高Lua編程的效率和代碼的可讀性具有重要意義。 1.迭代器概述 1.1 迭代器介紹 迭代器是一種設計模式,它提供了一種訪問集合元素的方法,而不需要暴露其底層結構。在Lua中,迭代器通常以一個函…

hot100_240. 搜索二維矩陣 II

hot100_240. 搜索二維矩陣 II 直接遍歷列減行增 編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性&#xff1a; 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,4,7,1…

一步到位Python Django部署,淺談Python Django框架

Django是一個使用Python開發的Web應用程序框架&#xff0c;它遵循MVC&#xff08;Model-View-Controller&#xff09;設計模式&#xff0c;旨在幫助開發人員更快、更輕松地構建和維護高質量的Web應用程序。Django提供了強大的基礎設施和工具&#xff0c;以便于處理復雜的業務邏…

Apache PAIMON 學習

參考&#xff1a;Apache PAIMON&#xff1a;實時數據湖技術框架及其實踐 數據湖不僅僅是一個存儲不同類數據的技術手段&#xff0c;更是提高數據分析效率、支持數據驅動決策、加速AI發展的基礎設施。 新一代實時數據湖技術&#xff0c;Apache PAIMON兼容Apache Flink、Spark等…

《計算機網絡》課后探研題書面報告_了解PPPoE協議

PPPoE協議的工作原理與應用分析 摘 要 PPPoE&#xff08;Point-to-Point Protocol over Ethernet&#xff09;是一種廣泛應用于寬帶接入的網絡協議&#xff0c;特別是在DSL&#xff08;數字用戶線路&#xff09;和光纖網絡中具有重要的應用價值。PPPoE結合了PPP協議的認證、加…

【MySQL學習筆記】MySQL存儲過程

存儲過程 1、基礎語法2、變量2.1 系統變量2.2 用戶自定義變量2.3 局部變量 3、if 流程控制4、參數5、case 流程控制6、循環結構6.1 while 循環6.2 repeat 循環6.3 loop 循環 7、游標8、存儲函數 存儲過程是事先經過編譯并存儲在數據庫中的一段 SQL 語句的集合&#xff0c;調用存…

MAC上安裝Octave

1. 當前最新版Octave是9.3版本&#xff0c;需要把mac os系統升級到14版本&#xff08;本人之前的版本是10版本&#xff09; https://wiki.octave.org/Octave_for_macOS octave的歷史版本參考此文檔&#xff1a;Octave for macOS (outdated) - Octavehttps://wiki.octave.org/Oc…

mysql-5.7.18保姆級詳細安裝教程

本文主要講解如何安裝mysql-5.7.18數據庫&#xff1a; 將綠色版安裝包mysql-5.7.18-winx64解壓后目錄中內容如下圖&#xff0c;該例是安裝在D盤根目錄。 在mysql安裝目錄中新建my.ini文件&#xff0c;文件內容及各配置項內容如下圖&#xff0c;需要先將配置項【skip-grant-tab…

VSCode連接Github的重重困難及解決方案!

一、背景&#xff1a; 我首先在github創建了一個新的項目&#xff0c;并自動創建了readme文件其次在vscode創建項目并寫了兩個文件在我想將vscode的項目上傳到對應的github上時&#xff0c;錯誤出現了 二、報錯及解決方案&#xff1a; 1.解決方案&#xff1a; 需要在git上配置用…

YOLOV8漲點技巧之混合注意力與特征金字塔網絡融合

YOLO發展歷程 自2015年YOLOv1問世以來,這一革命性的目標檢測算法經歷了一系列重大升級。以下是YOLO各版本的主要發展里程碑: 版本 發布時間 主要開發者 YOLOv1 2015年6月 Joseph Redmon YOLOv2(YOLO9000) 2016年12月 Joseph Redmon YOLOv3 2018年4月 Joseph Redmon

數據分析:非度量多維排列 NMDS (Non-metric multidimensional scaling)ANOSIM檢驗分析

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹原理步驟加載R包數據下載導入數據數據預處理計算距離矩陣ANOSIM檢驗非度量多維排列NMDS應力值(stress value)畫圖輸出系統信息介紹 非度量多維排列(Non-metric Multidimensiona…

Open FPV VTX開源之ardupilot配置

Open FPV VTX開源之ardupilot配置 1. 源由2. 配置3. 總結4. 參考資料5. 補充5.1 飛控固件版本5.2 配置Ardupilot的BF OSD5.3 OSD偏左問題 1. 源由 飛控嵌入式OSD - ardupilot配置使用ardupliot配套OSD圖片。 Choose correct font depending on Flight Controller SW. ──>…

硬件實用技巧:TPS54331DR橫杠標識識別1引腳

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/145116969 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV…

Python庫之PyAutoGUI安裝以及使用方法

Date: 2025.01.15 20:54:01 author: lijianzhan PyAutoGUI是一個功能強大的Python庫&#xff0c;它允許我們用于通過編程控制鼠標和鍵盤&#xff0c;實現自動化任務。它可以模擬用戶的輸入操作&#xff0c;例如點擊、拖動、輸入文本等&#xff0c;適用于 GUI 自動化、測試腳本、…

Linux離線部署ELK

文章目錄 前期準備開始安裝安裝elastic search安裝logstash安裝kibana 配置ELK配置ElasticSearch配置logstash配置kibana 啟動ELK啟動命令啟動測試 設置ELK策略創建ILM策略將ILM策略與日志index關聯查看索引是否被ILM策略管理 前期準備 ELK包含三部分軟件 ElasticSearch用作搜…

Go語言的數據競爭 (Data Race) 和 競態條件 (Race Condition)

文章精選推薦 1 JetBrains Ai assistant 編程工具讓你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的圖標增強神器 3 IDEA插件推薦-SequenceDiagram&#xff0c;自動生成時序圖 4 BashSupport Pro 這個ides插件主要是用來干嘛的 &#xff1f; 5 IDEA必裝的插件&…