zoukankan      html  css  js  c++  java
  • .NET中的堆(Heap)和栈(Stack)的本质

    计算机的内存可以分为代码块内存,Stack内存和Heap内存。代码块内存是在加载程序时存放程序机器代码的地方。

    栈(Stack)一般存放函数内的局部变量。

    堆(Heap)一般存放全局变量和类对象实例等。

    若只是声明一个对象,则先在栈内存中为其分配地址空间,若再实例化它,则在堆内存中为其分配空间。

    1、Stack VS Heap

         由于计算机的内存分配过程比较抽象,下面举一个简单的程序片段,来图解和谐步骤对Stack和Heap内存的影响:

    下面的StackVsHeap类有一个Person类和Fun1方法,当调用Fun1方法时,

         当执行第一句语句,即:

    int i=3;

    在.net中,除了string、object、class、delegate、interface外,其他的类型为数值类型。一般(不是全部)存放在Stack内存中。

    此处 int i=3; 是函数内的非静态变量,而数值类型为非引用类型,即会在Stack内存中分配一块区域来存放该变量的名和值。

         当执行第二句语句,即:

    int j=i;

    .net也会在Stack内存中分配一个区域来存放该变量的名和值。而且地址块在 i=3 上面(LIFO)。

    解释:

         ① FIFO(全称:First in,First out):先进先出。

         ② LIFO(全称:Last in,First out):后进先出。

         当执行第三句语句,即:

    Person p = new Person();

    时,我们可以分为两步来看:

         1) 在Stack上分配一个Person类型的p引用变量(指针)(指向Heap上的地址);

         2)  在Heap上分配一个控件来存储Person类的实例数据;

    具体的过程如下图所示:

    2、值类型和引用类型

    理解了上面的过程,现在理解值类型和引用类型的变量则更加容易:

         先看下面的图:

    由于 int j=i; 中是int类型,为值类型变量,则 j=3 为 i=3 的拷贝;因此,修改 i 不会修改 j,修改 j 也不会修改 i;

    而 Person p2=p 中Person类,是引用类型,因此p2和p指向同一个Heap地址块;因此,修改p2的值就会影响p的值。

  • 相关阅读:
    java学习笔记 (2) —— Struts2类型转换、数据验证重要知识点
    java学习笔记 (1) —— Strut2.3.24环境搭建
    数据不平衡问题的处理
    正则化与特征稀疏,过拟合
    leetcode144-先序遍历非递归实现
    解释器资料
    ROC,AUC
    假设检验——KS检验
    SVM理解
    高斯过程与核密度估计
  • 原文地址:https://www.cnblogs.com/pingming/p/5240553.html
Copyright © 2011-2022 走看看