方法的代码块在执行时是在栈中还是堆中?
Does the Code Block of a method live in the stack or heap at the moment of execution?
我是学习编程语言的新手,我觉得我对面向对象编程语言,更具体地说是 C# 语言的理解程度为 20% 到 25%。所以我真的在不知道它的答案对我学习语言的过程有什么实际意义的情况下提出这个问题,但我真的觉得我需要问它。
当一个方法被调用执行时,我知道它所有的局部变量及其参数和return值实际上都存在于堆栈内存中。虽然方法本身是作为实例化对象或静态 class 的成员或作为非静态 class.
的静态成员从堆内存中调用的
现在我的问题是,当方法被调用到堆栈中时,是只有变量和参数会存在于堆栈中,还是整个方法及其所有代码块都存在在那一刻(执行)在堆栈中?
此查询源于对实例化方法(或静态方法)内代码块性质的类似比较,在调用方法时和未调用方法时,与性质进行比较非静态class的成员,而class被实例化为一个对象,而不是。
现在,非静态 class 的成员被认为是蓝图,即它们以不可接近且无功能的形式存在(无法调用字段和方法,并且字段的值不能改变,方法不能改变值),但是这个蓝图相当可实例化为一个具体的功能对象及其成员。
现在,如果堆中实例化方法中的代码块只是一个蓝图,一个蓝图实际上会在方法被调用时 "instantiated" 进入堆栈,以执行它们在其中的任务堆栈,然后在任务完成后从堆栈中删除。这里的栈可以看作是程序实际执行的地方,而另一方面,堆中的所有东西,包括静态 classes 和对象,以及堆本身,都将被看作是一个纯粹的存储位置堆栈不时借用和使用的数据和指令,堆栈实际上执行我们整个程序的任务。
然而,如果堆栈内存实际上并不包含正在执行的方法的代码,并且堆栈仅采用方法的局部变量和参数的临时值,而方法本身在堆中并发地从它的堆位置执行编码指令,只把值借给进程中的堆栈。这里的堆栈看起来就像一个变量的值持有者,而对象和静态 classes 及其方法是程序的实际执行者,它们在堆本身中,以及一个实例化方法(或静态方法)它的代码具体存在并在堆中运行。
第三种可能性是两个内存(堆栈和堆)都不是代码执行的实际位置,而是在处理器本身的某个地方,数据的执行和更改正在发生,堆和堆栈只是在接受、保存和清理数据和指令方面用于不同使用模式的存储位置,仅此而已。
很抱歉问了这么长的问题,我不知道它的答案对我这个程序员有多大帮助,但确实让我头疼了几天,找不到合适的答案在专为初学者设计的文本中回答,所以我真的不知所措!
程序代码在程序代码区。它既不在堆中也不在堆栈中。它在程序执行时由加载程序设置的内存区域中。
我建议您阅读更多有关程序链接和加载的内容。
方法未实例化。 类 被 实例化以创建对象。
对象由数据成员和方法组成。只有数据成员动态分配在进程内存中的某个位置。所有方法的代码都静态地位于内存中称为 'code segment' 的部分。任何方法的代码都不会被复制。不需要它,因为它是完全恒定的。
堆栈与代码无关。只有局部变量和参数存在于堆栈中。请注意,如果变量/参数的类型是引用,则只有引用(指针)的值存在于堆栈中,但它指向的实际对象位于其他地方。
一篇介绍 .NET 内存管理基础知识的文章 can be found here。
注意:这有点简化了视图,但对于您的知识水平来说是准确的。
我是学习编程语言的新手,我觉得我对面向对象编程语言,更具体地说是 C# 语言的理解程度为 20% 到 25%。所以我真的在不知道它的答案对我学习语言的过程有什么实际意义的情况下提出这个问题,但我真的觉得我需要问它。
当一个方法被调用执行时,我知道它所有的局部变量及其参数和return值实际上都存在于堆栈内存中。虽然方法本身是作为实例化对象或静态 class 的成员或作为非静态 class.
的静态成员从堆内存中调用的现在我的问题是,当方法被调用到堆栈中时,是只有变量和参数会存在于堆栈中,还是整个方法及其所有代码块都存在在那一刻(执行)在堆栈中?
此查询源于对实例化方法(或静态方法)内代码块性质的类似比较,在调用方法时和未调用方法时,与性质进行比较非静态class的成员,而class被实例化为一个对象,而不是。
现在,非静态 class 的成员被认为是蓝图,即它们以不可接近且无功能的形式存在(无法调用字段和方法,并且字段的值不能改变,方法不能改变值),但是这个蓝图相当可实例化为一个具体的功能对象及其成员。
现在,如果堆中实例化方法中的代码块只是一个蓝图,一个蓝图实际上会在方法被调用时 "instantiated" 进入堆栈,以执行它们在其中的任务堆栈,然后在任务完成后从堆栈中删除。这里的栈可以看作是程序实际执行的地方,而另一方面,堆中的所有东西,包括静态 classes 和对象,以及堆本身,都将被看作是一个纯粹的存储位置堆栈不时借用和使用的数据和指令,堆栈实际上执行我们整个程序的任务。
然而,如果堆栈内存实际上并不包含正在执行的方法的代码,并且堆栈仅采用方法的局部变量和参数的临时值,而方法本身在堆中并发地从它的堆位置执行编码指令,只把值借给进程中的堆栈。这里的堆栈看起来就像一个变量的值持有者,而对象和静态 classes 及其方法是程序的实际执行者,它们在堆本身中,以及一个实例化方法(或静态方法)它的代码具体存在并在堆中运行。
第三种可能性是两个内存(堆栈和堆)都不是代码执行的实际位置,而是在处理器本身的某个地方,数据的执行和更改正在发生,堆和堆栈只是在接受、保存和清理数据和指令方面用于不同使用模式的存储位置,仅此而已。
很抱歉问了这么长的问题,我不知道它的答案对我这个程序员有多大帮助,但确实让我头疼了几天,找不到合适的答案在专为初学者设计的文本中回答,所以我真的不知所措!
程序代码在程序代码区。它既不在堆中也不在堆栈中。它在程序执行时由加载程序设置的内存区域中。
我建议您阅读更多有关程序链接和加载的内容。
方法未实例化。 类 被 实例化以创建对象。
对象由数据成员和方法组成。只有数据成员动态分配在进程内存中的某个位置。所有方法的代码都静态地位于内存中称为 'code segment' 的部分。任何方法的代码都不会被复制。不需要它,因为它是完全恒定的。
堆栈与代码无关。只有局部变量和参数存在于堆栈中。请注意,如果变量/参数的类型是引用,则只有引用(指针)的值存在于堆栈中,但它指向的实际对象位于其他地方。
一篇介绍 .NET 内存管理基础知识的文章 can be found here。
注意:这有点简化了视图,但对于您的知识水平来说是准确的。