C# 中的堆和栈

简介:

原文C# 中的堆和栈

   栈上存储的有:值类型,引用类型本身。

        栈内存就像一系列堆得越来越高的箱子。调用方法是,它的每一个参数都被放入一个箱子,并将这个箱子放到栈的最顶部。每个局部变量也同样分配到一个箱子,并同样放到栈的最顶部。方法结束后,它的所有箱子都从栈中移除。
        堆上存储的有:引用类型的“对象”,可空类型。

        堆内存则像散布在房间里的一大堆箱子,而不像栈那样每个箱子都严格地堆在另一个箱子上面。每一个箱子都有一个标签,它标记了这个箱子是否正在使用。创建一个新对象时,runtime 会查找一个空箱子,并把它分配给对象。对对象的引用则存储在栈上的一个局部变量中。runtime 将跟踪每个箱子的引用数量(有多个变量引用同一个对象)。一旦最后一个引用消失,runtime 就将箱子标记为“未使用”。将来某个时候,会清除箱子里的东西,使之能被真正重用。

        另外,堆内存是一种有限资源,如果被耗尽,new 操作符将抛出一个 OutOfMemoryException ,对象将创建失败。

        代码如下:

 

复制代码
    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    namespace stack_heap  
    {  
        class Program  
        {  
            static void Main(string[] args)  
            {  
            }  
      
            void Method(int param)  
            {  
                Circle c;  
                c = new Circle(param);  
            }  
        }  
      
        class Circle  
        {   
            public Circle(int a)  
            {             
            }  
        }  
    }  
复制代码

 

调用Method 方法时,并给 param 传递实参为 8 后:

1、首先,栈中将分配一小片内存(刚好能存储一个 int),并用值 8 来初始化。

2、在方法内部,还要中分配出另一小片内存,它刚好能存储一个引用一个内存地址),只是暂时不进行初始化(它是为Cricle 类型的变量 c 准备的)。

3、接着从堆中分配一个足够大的内存区域来容纳一个 Circle 对象

        PS:new 关键字执行的操作 --- 它运行 Circle 构造器将这个原始的堆内存转换成一个 Circle 对象

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。




    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5947926.html,如需转载请自行联系原作者


相关文章
|
4天前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
40 0
|
机器学习/深度学习 人工智能 C#
C#<数据结构>栈的应用——括号分配问题
C#<数据结构>栈的应用——括号分配问题
57 0
|
C#
【C#/WPF】图像变换的Undo撤销——用Stack命令栈
原文:【C#/WPF】图像变换的Undo撤销——用Stack命令栈 需求: 图层中有一张图片,可以对该图层进行平移、缩放、旋转操作,现在要求做Undo撤销功能,使得图层回复上一步操作时的状态。
843 0
|
Go C# C++
译文---C#堆VS栈(Part Two)
原文:译文---C#堆VS栈(Part Two) 前言          在本系列的第一篇文章《C#堆栈对比(Part One)》中,介绍了堆栈的基本功能和值类型以及引用类型在程序运行时的表现,同时也包含了指针作用的讲解。
1071 0
|
Java C# C++
译文---C#堆VS栈(Part One)
原文:译文---C#堆VS栈(Part One) 前言   本文主要是讲解C#语言在内存中堆、栈的使用情况,使读者能更好的理解值类型、引用类型以及线程栈、托管堆。       首先感谢原文作者:Matthew Cochran 为我们带来了一篇非常好的文章,并配以大量图示,帮助我们更好的理解堆栈之间的调用,本文是在作者原文的基础上进行内容上的精简以及加入我个人在这方面的理解和注释。
1228 0
|
.NET C# 索引
[CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
原文:[CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系   CLR要求所有类型最终都要从System.Object派生。也就是所,下面的两个定义是完全相同的, //隐式派生自System.Object class Employee { ..... } //显示派生子 System.Object class Employee : System.Object { ..... }   由于所有类型最终都是从System.Object派生的,所以可以保证每个类型的每个对象都有一组最基本的方法。
1040 0