美文网首页
c#中的堆与栈

c#中的堆与栈

作者: 困卡 | 来源:发表于2017-03-22 21:38 被阅读0次
    1. 简介:
      我们把内存分为堆空间和栈空间
      线程堆栈:简称栈 Stack 栈空间比较小,但是读取速度快
      托管堆: 简称堆 Heap 堆空间比较大,但是读取速度慢
    1. 栈:
      栈的特征:数据只能从栈的顶端插入和删除把数据放入栈顶称为入栈(push)从栈顶删除数据称为出栈(pop)

    1. 堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除


    2. GC Garbage Collector垃圾回收器
      CLR的GC就是内存管理机制,我们写程序不需要关心内存的使用,因为这些都是CLR帮我们做了。

    垃圾回收机制

    C#中栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

    栈 vs 堆:区别?

    栈通常保存着我们代码执行的步骤,而堆上存放的则多是对象,数据等。我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部取走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶取走,接着下一个。堆则不然,像是一个仓库,储存着我们使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。
    栈与堆示意图


    堆与栈

    栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC(Garbage collection:垃圾收集器)清理。

    什么元素被分配到栈?什么被分配到堆?

    栈存储的是基本值类型,堆存储的是new出来的对象。引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。
    当我们程序执行的时候,在栈和堆中分配有四种主要的类型:值类型,引用类型,指针,指令。

    值类型:
    在C#中,继承自System.ValueType的类型被称为值类型,主要有以下几种(CLR2.0中支持类型有增加):

    • bool
    • byte
    • char
    • decimal
    • double
    • enum
    • float
    • int
    • long
    • sbyte
    • short
    • struct
    • uint
    • ulong
    • ushort

    引用类型:
    以下是引用类型,继承自System.Object:

    • class
    • interface
    • delegate
    • object
    • string
      指针:在内存区中,指向一个类型的引用,通常被称为“指针”,它是受CLR( Common Language Runtime:公共语言运行时)管理,我们不能显示使用。需要注意的是,一个类型的引用即指针跟引用类型是两个完全不同的概念。指针在内存中占一块内存区,它本身只代表一个内存地址(或者null),它所指向的另一块内存区才是我们真正的数据或者类型。


      指针示意图

      (图2)
      指令:指向调用的方法的内部,如果该方法是第一次执行,首先要进行JIT即时编译。

    相关文章

      网友评论

          本文标题:c#中的堆与栈

          本文链接:https://www.haomeiwen.com/subject/tjlanttx.html