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-CC#​
类代码存储位置代码段(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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…