zoukankan      html  css  js  c++  java
  • 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 对象

  • 相关阅读:
    Fruit Ninja(随机数rand())
    C. A Mist of Florescence ----- Codeforces Round #487 (Div. 2)
    给力的移动 FZU
    FZU 2254 英语考试 (最小生成树)
    6486: An Ordinary Game(规律)
    HDU 1114: Piggy-Bank
    HDU 5916: Harmonic Value Description
    1072 威佐夫游戏
    1069 Nim游戏
    1066 Bash游戏
  • 原文地址:https://www.cnblogs.com/arxive/p/5947926.html
Copyright © 2011-2022 走看看