2015-09-05 87 views
2

我对学习编程语言比较陌生,我觉得我对面向对象编程语言(更具体地说是C#语言)有20%至25%的理解。所以我真的在不知道其答案的实际意义的情况下对我的语言学习过程陈述这个问题,但我真的觉得我需要问这个问题。方法的代码块在执行时是否处于堆栈或堆中?

当一个方法被调用执行时,我知道它的所有局部变量及其参数和返回值实际上存在于堆栈内存中。虽然方法本身是从堆内存中作为实例化对象或静态类的成员,或作为非静态类的静态成员调用的。

现在我的问题是,当方法被调用到堆栈中时,它是否只存在于堆栈中的变量和参数,还是它的所有代码块的整个方法将存在于在那一刻(执行)的堆栈?

该查询已经从代码块的性质的一个实例化的方法(或静态方法)内的类似的对比出现,而该方法被调用并且同时不会被调用它,相比的性质时一个非静态类的成员,而类被实例化成一个对象,而不是。

现在,一个非静态类的成员,被认为像一个蓝色打印,即它们在一个形式是非平易近人和非功能现有的(字段和方法不能被称为,和字段的值不能改变,方法不能改变值),但是这个蓝图相当实例化为具有其成员的具体功能对象。

现在,如果堆中的实例化方法内的代码块只是一个蓝图,当调用该方法时实际上会在堆栈中“实例化”的蓝图在堆栈中执行任务,然后在任务完成时从堆栈中删除。在这里堆栈可以被看作是程序实际执行的地方,而另一方面,包括静态类和对象以及堆本身的堆中的所有内容都将被视为仅仅是数据和指令的存储位置堆栈借用和利用,堆栈实际上执行我们整个程序的任务。

但是,如果堆栈内存实际上没有包含正在执行的方法的代码,并且堆栈只接收方法的局部变量和参数的临时值,而堆中的方法本身同时从其堆位置执行编码指令,只将值借给进程中的堆栈。在这里,堆栈看起来就像是一个变量的值持有者,而对象和静态类与他们的方法一起是程序本身在堆中的实际执行者,而具有代码的实例化方法(或静态类)是具体存在的并在堆中运作。

第三种可能性是,两个存储器(堆栈和堆)都不是实际的代码执行位置,而是处理器本身的某处,数据的执行和更改正在发生,堆栈和堆栈仅仅是接受,保存和清理数据和指令方面的不同利用模式的存储位置,就是这样。

对于这么长的问题,我很抱歉,我不知道如何帮助我作为程序员获得答案,但它真的让我头痛几天,我找不到答案在为初学者设计的文本中,所以我真的不知所措!

回答

4

方法不是实例化。类实例化,以创建对象。

对象由数据成员方法组成。只有数据成员动态地分配在进程内存中的某个地方。所有方法的代码都静态地位于称为“代码段”的一段内存中。没有任何方法的代码被复制过。这是不需要的,因为它是完全不变的。

堆栈与代码无关。只有本地变量和参数存在于堆栈中。请注意,如果变量/参数的类型是引用,那么只有引用(指针)的值位于堆栈上,但它指向的实际对象位于其他位置。

一篇文章介绍.NET的内存管理基础知识can be found here

注意:这是一个有点简化的观点,但对于你的知识水平是准确的。

+0

这个问题被标记为C#,这使事情变得复杂,因为像C#和JavaScript这样的语言可以在堆上运行时生成代码。 –

+0

@ PeterTorr-MSFT当然。但是,OP还没有开始考虑这些概念。 –

2

程序代码位于程序的代码区域。它既不堆也不堆栈。它在程序执行时由加载程序设置的内存区域中。

我建议你阅读更多关于程序链接和加载。

+0

学习一些程序集也会有所帮助。获取堆栈指针,指令指针以及查看跳转的工作方式真的有助于绘制图片。 –