C#堆和堆栈有什么区别

如题所述

首先堆栈和堆(托管堆)都在进程的虚拟内存中。(在32位处理器上每个进程的虚拟内存为4GB)

堆栈stack

堆栈中存储值类型。

堆栈实际上是向下填充,即由高内存地址指向地内存地址填充。

堆栈的工作方式是先分配内存的变量后释放(先进后出原则)。

堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突!

堆栈的性能非常高,但是对于所有的变量来说还不太灵活,而且变量的生命周期必须嵌套。

通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内数据仍然可以使用。此时就要用到堆(托管堆)!

堆(托管堆)heap

堆(托管堆)存储引用类型。

此堆非彼堆,.NET中的堆由垃圾收集器自动管理。

与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。

比如创建一个对象:

Customer cus;

cus = new Customer();

申明一个Customer的引用cus,在堆栈上给这个引用分配存储空间。这仅仅只是一个引用,不是实际的Customer对象!

cus占4个字节的空间,包含了存储Customer的引用地址。

接着分配堆上的内存以存储Customer对象的实例,假定Customer对象的实例是32字节,为了在堆上找到一个存储Customer对象的存储位置。

.NET运行库在堆中搜索第一个从未使用的,32字节的连续块存储Customer对象的实例!

然后把分配给Customer对象实例的地址赋给cus变量!

从这个例子中可以看出,建立对象引用的过程比建立值变量的过程复杂,且不能避免性能的降低!

实际上就是.NET运行库保存对的状态信息,在堆中添加新数据时,堆栈中的引用变量也要更新。性能上损失很多!

有种机制在分配变量内存的时候,不会受到堆栈的限制:把一个引用变量的值赋给一个相同类型的变量,那么这两个变量就引用同一个堆中的对象。

当一个应用变量出作用域时,它会从堆栈中删除。但引用对象的数据仍然保留在堆中,一直到程序结束 或者 该数据不被任何变量应用时,垃圾收集器会删除它。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-12-30
线程堆栈:简称栈 Stack
托管堆: 简称堆 Heap

栈与堆的区别
栈通常保存着代码执行的步骤,如在代码段1中 AddFive()方法,int pValue变量,int result变量等等。而堆上存放的则多是对象,数据等。可以把栈想象成一个接着一个叠放在一起的盒子。当使用的时候,每次从最顶部取走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶取走,接着下一个。堆则不然,像是一个仓库,储存着使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。
栈内存无需管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC(Garbage collection:垃圾收集器)清理。本回答被网友采纳
第2个回答  2011-07-18
你应该问堆和栈的区别 c#里很少用到这些概念 其实在你new 一个对象的时候,你这个对象是放在内存里的
第3个回答  2011-07-18
先进先出,先进后出?
第4个回答  2011-07-18
堆栈存储值类型以及引用类型的引用...托管堆存储引用类型对象...建议你看看关于CLR方面的书籍

浅谈C#中堆和栈的区别
1、栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放;2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。三、堆栈数据结构区别:堆(数据结构):堆可以被看成是一棵树,如:...

C#中堆和堆栈有什么不一样?
首先堆栈和堆(托管堆)都在进程的虚拟内存中。(在32位处理器上每个进程的虚拟内存为4GB)堆栈stack 堆栈中存储值类型。堆栈实际上是向下填充,即由高内存地址指向地内存地址填充。堆栈的工作方式是先分配内存的变量后释放(先进后出原则)。堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的...

C#中堆栈和堆是什么? 遍历又是什么,有什么用处。
数据结构方面的堆和栈,这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足后进先出的性质的数学或数据结构。遍历就是按照一定的顺序,从头到尾将存储的数据(链表中、堆中、栈中)访问一遍。遍历的用处简单的说就是通过遍历找到合适的结点或...

C#值类型和引用类型,堆和堆栈的区别
基本区别在于它们在内存中的存储方式。值类型只将值存放在内存中,这些值类型都存储在堆栈中。原始数据类型(如bool和int)都属于此类型。而引用类型的内存单元中只存放内存堆中对象的地址,而对象本身放在内存堆中。如果引用的值类型的值是null,则表示未引用任何对象。堆和堆栈区别:堆和堆栈是两个不同...

专题|堆、栈简介
堆堆是程序员可控的内存区域,用于动态分配内存,尤其在不明确数据存储时间或大小时。虽然效率略低于栈,但堆的灵活性更高,因为编译器不需要预先知道内存需求。C#中,值类型有时也会在堆上存储,如用`new`创建的实例。栈栈则是编译器自动管理的内存,常用于存储函数参数、局部变量等。栈的优势在于速度...

求名词解释:C#中的托管堆,堆栈,堆,栈
其实堆栈说法有点那啥···也就是栈,后进先出(也有说先进后出的)堆,就比较难表达,他是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆...

c#程序运行时内存分为哪几个区?
一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。栈区:在执行函数时,函数内局部变量的存储单元都...

C#中栈和堆怎么定义
栈当中存放的是值类型,如int,decimal,double,enum等 堆当中存放的是引用类型,如string,类等 如图,如果定义一个int类型的变量i:int i = 5;那么在内存中的实际情况是:直接在栈中存放i的值5.如果顶一个string类型的变量s:string s = "A string.";那么在内存中的实际情况是:在堆中存放s的...

计算机二级公共基础C语言部分,关于栈
这就是先进后出。一个栈能存放5个数据,例如往里这往A,B,C,D,E 假如说你就按上面的顺序进栈的话,那个出栈有很多种,比如其中一种出栈就是edcba 还可以这样,先进A、B,然后让A,B出栈,再进C,D,E,那么这时出栈就是BAEDC,二级C考试公共基础时,就是考试出栈序列的 ...

自动内存管理机制深入剖析-C#分析篇
托管资源在 NET Framework中又分别存放在两种地方: 堆栈 和 托管堆 (以下简称 堆 );规则是 所有的值类型(包括引用和对象实例)和引用类型的引用都存放在 堆栈 中 而所有引用所代表的对象实例都保存在堆中 在C#中 释放托管资源是可以自动通过 垃圾回收器 完成的(注意 垃圾回收 机制是 NET Framework的...

相似回答