浅谈对象的内存分配及对象的成员的访问(三)--方法的内存分配

以前的文章已经介绍了对象在内中的分布,但是我们知道讨论了对象中成员字段的分布,今天我们来讨论方法的分布。
   首先我们要搞清的一个基本的概念就是成员方法的内存分布和内存的对象的肯定有很大的差距,为什么呢?因为从以前的解释中我们很容易理解成员字段在内存中只不过是会用到一个固定大小的空间,比如整型就是4个字节、float也是4个字节,自定义的类型也只会占一个整型大小来保存引用的地址,但是方法不一样,它不是类型,所以CLR没有办法检测到它的具体大小,没有把办法给他分配空间,那么方法到底在内存中怎么分配呢?
   在讲述分配之前我们还要在讨论下JIT是如何来调用我们的方法的,有如下的代码:
public class BaseClass
{
   ....
   public string test = "Test";  
   public void Method()
   {
     Console.WriteLine("这是一个方法!");
   }
   public void Method(string str)
   {
     Console.WriteLine("这是一个重载方法!");
   }
}
public class MainClass
{
   //程序的入口点
   public static void Main()
   {
     BaseClass bc = new BaseClass();
     bc.Method(); //方法调用
   }
}
在Main方法执行之前,CLR会首先检测出Main方法中用到的所有的类型,我们这里用到的类有自己定义的Baseclass,然后CLR会在内中分配一块内存来保存BaseClass中使用到的每一个方法,但是不会保存方法的实现(要是把每个方法的实现都保存进去,那内存就吃不消了,比如Console的WriteLine方法有多少个重载啊,但是我们往往使用的只有其中一个,如果几十个方法的内容都放到内中,那就亏大了),这里我们可以理解为保存就是方法的一个空架子(但是这个空架子中有一个未文档化的函数,我们称为JITCompiler),但是值得我们注意的是每个方法都会有一个地址。当开始调用其中的某一个方法时,根据这个地址可以在CLR分配的用于保存方法的内存中找到我们想要调用的方法,然后在这个空架子中的JITCompiler就会将指定的方法的IL内容编译成CPU指令,然后CPU执行这些指令方法就执行了,如图:

经过上面的分析,我们就可以这么理解了,其实对象实例化以后,方法也会在堆中有所体现,那就是一个地址,一个保存CLR在内存中分配的保存类型中所有方法的地址,因为类型中可能会有很多方法,为了便于操作和理解,我们这块CLR分配的内存理解成一个表,那么其中的每个方法就是一条记录,如上图。于是我们在以前分析出的对象在内存中的分布图就变了些样子,如BaseClass bc = new BaseClass()的内存分布就变成了下面的样子:
  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值