`

从内存布局角度谈谈值类型和引用类型!

阅读更多

 

转自:http://www.cnblogs.com/xuefeng1982/archive/2009/10/09/1579816.html

 

 

 

 

深入理解值类型和引用类型,这是.NET开发人员取得长期成功的关键,下面从内存布局角度详细给大家说明一下值类型和引用类型:
     值类型的内存结构:

     引用类型的内存结构:

     
引用类型的实例比值类型的实例多了两个附加的字段,SyncBlockIndex和RTTI(运行时类型信息)指针,指向一个方法表结构,所以描述为 MethodTablePtr和TypeObjectPtr都是可以的,〈CLR Via C#〉这本书的第一版标注的是MethodTablePtr,第二版标注的是TypeObjectPtr,这里应该是Jeffery认为 TypeObjectPtr更加准确。
另外,除Object和ValueType类型以外,值类型不能继承其他任何类型,同时也无法作为其他值类型的基类,所以一般情况下,也就无需方法表指针 了!需要调用调用从Object或ValueType继承的一些方法的时候,需要一个方法表指针,这时就需要对值类型进行装箱!
看一个例子:
public struct A
{
     public overrid String ToString()
     {
             return "A++";
      }
}

static void Main(string[] args)
{
       A a=new A();
       a.ToString();//这时不会发生装箱,因为C#编译器发现结构体A重写了ToString方法,于是产生直接调用ToString的IL指 令,而且不可能有类型继承自结构体A,所以编译器可以确定这里不会有多态性的行为,于是就无须方法表指针,也无须装箱!
       a.GetType();//这里会发生装箱,因为结构体A本身没有实现GetType方法,需要调用继承的GetType方法,这时需要一个方法表指针来访问方法表,这时需要通过装箱来获得!

分享到:
评论

相关推荐

    C++ 内存对象布局

    在C++中,对象的内存布局受到多种因素的影响,例如成员变量的类型、是否有虚函数等。接下来我们将详细探讨不同情况下的对象内存布局。 ##### 1. **空类** 空类是指没有任何成员变量的类。尽管此类没有任何成员,但...

    C++对象内存布局[归类].pdf

    从内存布局的角度来看,C++对象可以分为三部分:对象头、对象体和虚函数表。对象头中存储了对象的类型信息和虚函数表的指针,而对象体中存储了对象的成员变量,虚函数表中存储了对象的虚函数信息。 在C++对象的内存...

    易语言分析数据类型内存布局源码

    这些数据类型的内存布局直接影响到程序的运行效率和内存使用。 2. **数据类型内存布局** - **基本类型**:整数型在内存中通常按照机器字长对齐存储,例如,在32位系统中,一个整数占用4个字节,而在64位系统中,长...

    Java对象内存布局 - 小分析

    这部分按照对齐原则分配,可能包括各种基本类型和引用类型。 3. **填充数据(Padding)**:为了对齐,如果实例数据不足一个内存对齐单位,JVM会在对象尾部添加填充字节,确保对象大小为对齐单位的整数倍。 理解...

    易语言自定义数据类型的内存存储方式

    需要注意的是,易语言中的自定义数据类型在内存中是以值传递的方式进行操作的,这意味着当你将一个自定义数据类型的变量赋值给另一个变量时,实际上是复制了整个数据结构的内容,而不是引用。这种机制在处理大量数据...

    内存布局图

    C语言九阳神功----内存布局图!学习C语言最重要的莫过于了解内存分布,只有研究到底层去,才能更好的学习C!

    9 对象的实例化内存布局与访问定位.md,学习代码

    2. **实例数据**:这是对象真正存储字段值的地方,包括类中的基本类型和引用类型。基本类型如int、char等占用固定大小的内存,而引用类型则指向其他对象的地址。 3. **对齐填充**:由于JVM内存管理的对齐要求,如果...

    C# Struct的内存布局问题解答

    对于不包含引用类型的struct,内存布局遵循以下规则: 1. 成员按照定义的顺序排列。 2. 如果成员大小不足4字节,会在前面填充字节以达到对齐要求。例如,Byte a、Byte b和Long c的结构体,由于Long需要8字节对齐,...

    RTTI内存模型布局研究

    此外,marx-ndss-2017.pdf可能涉及的是安全或网络相关的议题,虽然与RTTI直接关系不大,但可能在某些上下文中,如安全分析或性能优化时,理解RTTI的内存模型布局是必要的,因为它可能影响到程序的内存占用和执行效率...

    浅析C语言中的内存布局

    在深入理解C语言内存布局时,还需要了解编译原理和操作系统层面的知识,比如如何从源代码生成a.out,以及如何将a.out映射到内存空间。这涉及到链接器的工作、段对齐的概念以及进程的内存模型等复杂主题。 总之,...

    RecyclerView加载不同的布局文件

    例如,如果数据对象有类型字段,可以根据类型返回对应的布局类型值。 5. **在`onCreateViewHolder()`中实例化ViewHolder**:根据`getItemViewType()`返回的值,创建相应的ViewHolder实例。使用LayoutInflater从XML...

    易语言分析数据类型内存布局源码-易语言

    在计算机编程中,数据类型的内存布局是指在计算机内存中如何分配和组织不同数据类型的空间。了解这一点对于优化代码性能、减少内存占用、防止内存错误等都有极大的帮助。易语言的数据类型包括基本类型(如整型、浮点...

    c++实现内存搜索源代码(和CE差不多)

    内存搜索是一种技术,用于在计算机的内存中查找特定值或模式,常被逆向工程师、游戏修改者和软件调试人员使用。"CE"是 Cheat Engine 的简称,它是一款流行的内存搜索工具,允许用户扫描进程内存中的值并进行修改。...

    C#内存管理变化.pdf

    - **值类型与引用类型的区别**:在.NET中,值类型(如整数、浮点数等基本数据类型)存放在栈中,而引用类型(如类、数组等复杂数据类型)则存放在托管堆上。栈内存的管理效率更高,但容量相对有限;而堆内存容量大,...

    GM内存修改工具GM内存修改工具

    - **内存指针**:识别和管理间接引用数据的内存地址链。 - **脚本支持**:通过脚本自动化修改过程,例如循环或条件语句。 为了更好地利用GM内存修改工具,用户需要具备一定的编程基础知识,特别是对内存管理和寻址...

    图特内存修改器图特内存修改器

    3. **寻址和数据类型**:熟悉各种数据类型的表示方式,如整型、浮点型、指针等,以及它们在内存中的布局。这有助于正确地识别和修改内存中的数据。 4. **内存扫描**:图特内存修改器会使用不同的扫描技术,如模糊...

    统计缓存(java对象所占的内存)大小

    - 字段变量,包括基本类型和引用类型。每个基本类型都有固定的内存占用,如int占4字节,long占8字节;引用类型则根据JVM的内存模型(如32位或64位)占用4或8字节。 3. **对齐填充**: - 为了满足内存对齐,可能会...

    Android 动态解析布局

    通过遍历XML节点,我们可以获取每个View的类型、属性和值。例如,`<TextView>`标签表示一个文本视图,`android:text`属性定义了显示的文本。 2. **View的创建**:解析XML后,我们可以根据获取的信息创建对应的View...

    RecyclerView加载多类型item 实现淘宝首页布局

    在Android应用开发中,...总的来说,通过RecyclerView的灵活配置和扩展,我们可以实现类似淘宝首页的复杂布局,展示各种类型的商品,同时提供流畅的滚动体验和高效的性能。希望这个教程能对你的电商应用开发带来帮助。

Global site tag (gtag.js) - Google Analytics