iOS 類存儲 與 C# 類存儲 的差異

C# 中類的代碼(包括方法、屬性等成員)的存儲機制與 Objective-C 有顯著差異,其核心依賴于 ?CLR(公共語言運行時)的方法表(Method Table)和虛擬方法表(vtable)機制,通過內存地址偏移實現高效調用。以下是具體原理和對比:


?? ?1. C# 類的代碼存儲機制?

(1)?方法表(Method Table)??
  • ?核心結構?:每個加載到內存的類在 CLR 中對應一個方法表,存儲在 ?Loader Heap(加載器堆)?? 中。
  • ?內容組成?:
    • ?類型元數據?:如類型標識、父類指針、接口映射表等。
    • ?方法槽(Slots)??:存儲類中所有方法(包括虛方法、非虛方法)的實際內存地址。
    • ?靜態字段?:靜態變量的內存空間直接內嵌在方法表中。
  • ?內存布局示例?:
    ┌───────────────────┐
    │    Method Table   │
    ├───────────────────┤
    │  Type Metadata    │ → 類名、父類、接口等  
    ├───────────────────┤
    │  vtable (Slots)   │ → [Method1地址][Method2地址]...  
    ├───────────────────┤
    │   Static Fields   │ → 靜態變量存儲區  
    └───────────────────┘
(2)?對象實例與方法調用?
  • ?對象頭(Object Header)??:每個對象實例在堆中分配時,頭部包含一個 ?指向方法表的指針?(稱為類型句柄)。
  • ?方法調用流程?:
    1. 通過對象頭找到方法表。
    2. 在 vtable 中按偏移量定位方法槽。
    3. 跳轉到方法槽指向的實際代碼地址執行。
    // 示例:方法調用
    var obj = new MyClass();
    obj.MyMethod();  // 實際執行:obj->方法表->vtable[MyMethod_slot]
(3)?靜態成員與代碼段?
  • ?靜態方法?:代碼本身存儲在 ?代碼段(Text Segment)?,但方法表中會記錄其地址,調用時直接跳轉(無需對象實例)。
  • ?靜態字段?:存儲于方法表內部的靜態區,生命周期與應用程序域(AppDomain)綁定。

?? ?2. 與 Objective-C 的對比?

?特性??Objective-C??C#??
?類代碼存儲位置?代碼段(Text Segment)代碼段(方法體)+ Loader Heap(方法表)
?方法調用機制?消息分發(objc_msgSend)動態查找方法實現vtable 偏移跳轉(靜態綁定+動態優化)
?內存模型?非連續(通過 isa 指針鏈式查找)連續方法表 + 對象頭指針
?擴展性?運行時動態添加方法(Category)僅支持預編譯固定布局

🔧 ?3. 關鍵設計優勢?

  1. ?性能優化?

    • ?虛方法調用?:vtable 通過固定偏移實現 O(1) 時間復雜度的跳轉,遠快于 Objective-C 的消息查找。
    • ?內聯緩存(Inline Caching)??:JIT 編譯器對高頻調用的虛方法生成直接跳轉代碼,避免查表開銷。
  2. ?內存安全?

    • 方法表由 CLR 統一管理,避免開發者直接操作內存地址,防止非法訪問。
  3. ?跨語言兼容?

    • 方法表是 .NET 跨語言(C#、VB.NET 等)的核心基礎,所有語言共享同一套元數據模型。

💎 ?總結?

C# 通過 ?方法表(Loader Heap) + 代碼段(方法體)?? 的二元結構存儲類代碼:

  • ?方法表? 作為核心樞紐,統一管理方法的尋址、靜態字段和類型元數據;
  • ?對象實例? 通過對象頭快速綁定到方法表,實現高效方法調用;
  • ?靜態成員? 直接嵌入方法表或代碼段,與類生命周期一致。

相比 Objective-C 的動態消息機制,C# 的 vtable 偏移模型在性能上更具優勢,但犧牲了運行時靈活性。

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

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

相關文章

Selenium自動化:輕松實現網頁操控

selenium自動化 1 什么是 Selenium 自動化 Selenium 是一個用于 Web 應用程序測試的工具,支持多種瀏覽器(如 Chrome、Firefox、Edge 等)。WebDriver 是 Selenium 的核心組件,用于控制瀏覽器行為并執行自動化操作。元素定位是通過…

又開發了一個優雅的小工具!

在開源項目中,Issues是一個強大的功能,用于跟蹤bug、功能請求和任務。然而,隨著項目的發展,Issues可能會變得難以管理,特別是當你需要離線訪問或進行深入分析時。 當然GitHub Issues除了上述功能以外,做在線…

【安裝教程】Docker Desktop 安裝與使用教程

文章目錄一、環境要求二、安裝步驟2.1 安裝 WSL 2(適用于非專業版 Windows 10 及 Windows 11)2.2 安裝 Docker Desktop2.3 漢化 DDocker Desktop2.4 卸載 Docker Desktop三、使用 Docker3.1驗證安裝3.2. 拉取鏡像3.3. 運行容器3.4. 查看容器3.5.更改容器…

Hutool 的 WordTree(敏感詞檢測)

package cn.hutool.dfa;WordTree 繼承自 HashMap<Character, WordTree>&#xff0c;表示一個字符到子樹的映射&#xff0c;構成一顆“詞樹”&#xff08;類似 Trie 樹&#xff09;&#xff0c;用于快速匹配字符串中的詞語&#xff08;敏感詞檢測、關鍵詞匹配等&#xff0…

Makefile 從入門到精通:自動化構建的藝術

引入 在軟件開發的世界里&#xff0c;“編譯” 是繞不開的環節&#xff0c;但手動編譯大型項目時&#xff0c;重復輸入編譯命令的痛苦&#xff0c;相信每個開發者都深有體會。Makefile 作為自動化構建的基石&#xff0c;能讓編譯過程“一鍵完成”&#xff0c;甚至智能判斷文件變…

利用DeepSeek將Rust程序的緩沖輸出改寫為C語言實現提高輸出效率

在前面多語言測試中&#xff0c;遇到一個難以置信的問題&#xff0c;rust的輸出到文件比c語言還快&#xff0c;這是不合情理的&#xff0c;通過對兩者輸出語句的比較&#xff0c;發現了不同。 rust程序在輸出到stdout前有這么一句 let mut writer BufWriter::with_capacity(6…

Java Optional 類教程詳解

一、Optional 類核心定位Optional 是 Java 8 引入的函數式容器類&#xff08;java.util.Optional&#xff09;&#xff0c;專為??顯式空值處理??設計。其核心價值在于&#xff1a;消除 60% 以上的傳統 null 檢查代碼通過類型系統強制空值聲明&#xff0c;降低 NPE 風險支持…

Agent X MCP 把想法編譯成現實

多模態GUI智能體協作型AI魔搭社區MCPMCP 硬件

cv快速input

效果<view class"miniWhether-box-lss"><view class"content-inp-text">快遞單號</view><input class"content-inp-input" type"text"v-model"expressInfo.expressNo" placeholder"填寫快遞單號&…

[AI8051U入門第十二步]W5500-Modbus TCP從機

學習目標: 1、了解Modbus Tcp協議 2、學習Modbus Tcp 從機程序驅動 3、使用 Modbus Pull調試一、Modbus TCP介紹? Modbus TCP 是一種基于 TCP/IP 網絡的工業通信協議,是 Modbus 協議家族中的一員,專門為以太網環境設計。它是 Modbus RTU(串行通信)協議的擴展,將 Modbus…

Python編程基礎與實踐:Python循環結構基礎

循環結構 學習目標 通過本課程的學習&#xff0c;學員可以掌握Python中for循環和while循環的基本使用方法&#xff0c;了解如何利用循環結構來重復執行代碼塊&#xff0c;以及如何使用break和continue語句來控制循環的執行流程。 相關知識點 循環結構 學習內容 1 循環結構 1.1 …

趣談設計模式之模板方法模式-老板,你的數字咖啡制作好了,請享用!

模板方法模式 定義了一套算法的骨架&#xff0c;講某些具體的步驟延遲到子類中實現。 主要用于不改變算法結構的情況下重新定義算法的某些步驟&#xff0c;以適應新的需求。 模板方法的角色 抽象類&#xff1a; 作為算法的骨架&#xff0c;該抽象類中包含了算法的核心部分和…

技術棧:基于Java語言的搭子_搭子社交_圈子_圈子社交_搭子小程序_搭子APP平臺

一、市場背景1、社會發展與生活方式轉變城市化進程加快&#xff1a;隨著城市化不斷推進&#xff0c;大量人口涌入城市&#xff0c;人們生活的物理空間距離拉近了&#xff0c;但人際關系卻在一定程度上變得疏離。傳統的基于血緣、地緣建立起的緊密社交關系難以滿足城市生活中的多…

字典在VBA與VB.NET的區別,舉例說明

簡述&#xff1a;在VBA中&#xff0c;字典通常使用Scripting.Dictionary對象&#xff0c;通過CreateObject("Scripting.Dictionary")創建。它需要引用Microsoft Scripting Runtime庫&#xff08;scrrun.dll&#xff09;。VBA字典的方法包括Exists、Add、Remove等&…

2024年網絡安全案例

以下是2024年造成嚴重損失的網絡安全典型案例&#xff0c;涵蓋市政系統、金融交易、區塊鏈平臺、國家級攻擊及全球性IT故障五大領域&#xff0c;按損失規模和技術危害性綜合排序&#xff1a;---一、市政基礎設施攻擊 1. 加拿大漢密爾頓市勒索軟件事件 - 損失&#xff1a;183…

PINN+貝葉斯:深度學習中的魔改新思路

2025深度學習發論文&模型漲點之——PINN貝葉斯PINN通過將物理定律&#xff08;如偏微分方程PDEs&#xff09;嵌入神經網絡的損失函數中&#xff0c;使得模型能夠利用已知的物理規律來指導學習過程&#xff0c;從而在數據有限或噪聲較多的情況下實現更高的準確性。然而&…

零基礎-動手學深度學習-8.3. 語言模型和數據集

很至關重要的一章: 8.3.1. 學習語言模型 8.3.2. 馬爾可夫模型與n元語法 n元語法看的序列長度是固定的&#xff0c; 存儲的序列長是有限且可控的&#xff0c;使用統計方法的時候通常使用這個模型&#xff01;&#xff01;&#xff01;統計方法&#xff01;&#xff01;&#x…

C++ 模板初階

什么是模板&#xff1f; 模板&#xff08;Template&#xff09;是 C 中實現泛型編程的核心工具。它允許我們編寫與具體數據類型無關的代碼&#xff0c;從而實現代碼復用和類型安全。為什么需要模板&#xff1f; 舉個生活中的例子&#xff1a;如果你要造一個能裝水的杯子&#x…

DockerFile文件執行docker bulid自動構建鏡像

文章目錄一、Dockerfile介紹二、Dockerfile鏡像制作和流程使用三、Dockerfile文件的制作鏡像的分層結構四、Dockerfile文件格式五、Dockerfile相關指令5.1 FROML&#xff1a;指定基礎鏡像5.2 LABEL&#xff1a;指定鏡像元數據5.3 RUN&#xff1a;執行shell指令5.4 ENV&#xff…

osloader!DoGlobalInitialization函數分析之HW_CURSOR--NTLDR源代碼分析之設置光標

第一部分&#xff1a; VOID DoGlobalInitialization(IN PBOOT_CONTEXT BootContextRecord){//// Turn the cursor off//HW_CURSOR(0,127);D:\srv03rtm\base\boot/inc/bldrx86.h:258:#define HW_CURSOR (*ExternalServicesTable->HardwareCursor)第二部分&#xff…