c#中的堆与栈

  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即时编译。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • [TOC] 内存管理 一、托管堆基础 在面向对象中,每个类型代表一种可使用的资源,要使用该资源,必须为代表资源的类...
    _秦同学_阅读 9,371评论 0 3
  • 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就...
    木有鱼丸啦阅读 3,596评论 0 0
  • jvm原理 Java虚拟机是整个java平台的基石,是java技术实现硬件无关和操作系统无关的关键环节,是java...
    AI乔治阅读 17,382评论 21 486
  • 可能你永远都不知道,形成世界观最初只要九块九,没错,17年某月某天某深夜,一个有效治愈我懒癌的idea突然涌上心头...
    沐沐如风阅读 2,990评论 1 1
  • 仿佛再一次经历了每个字都认识却看不懂意思的悲惨时刻,其实并非看不懂,只是没有心境罢了。 曾经也会面...
    斑帅阅读 1,778评论 0 0

友情链接更多精彩内容