永发信息网

C#堆和堆栈有什么区别

答案:5  悬赏:20  手机版
解决时间 2021-01-12 04:55
C#堆和堆栈有什么区别
最佳答案
线程堆栈:简称栈 Stack
托管堆: 简称堆 Heap

栈与堆的区别
栈通常保存着代码执行的步骤,如在代码段1中 AddFive()方法,int pValue变量,int result变量等等。而堆上存放的则多是对象,数据等。可以把栈想象成一个接着一个叠放在一起的盒子。当使用的时候,每次从最顶部取走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶取走,接着下一个。堆则不然,像是一个仓库,储存着使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。
栈内存无需管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC(Garbage collection:垃圾收集器)清理。
全部回答
先进先出,先进后出?
你应该问堆和栈的区别 c#里很少用到这些概念 其实在你new 一个对象的时候,你这个对象是放在内存里的
堆栈存储值类型以及引用类型的引用...托管堆存储引用类型对象...建议你看看关于CLR方面的书籍
首先堆栈和堆(托管堆)都在进程的虚拟内存中。(在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运行库保存对的状态信息,在堆中添加新数据时,堆栈中的引用变量也要更新。性能上损失很多!
有种机制在分配变量内存的时候,不会受到堆栈的限制:把一个引用变量的值赋给一个相同类型的变量,那么这两个变量就引用同一个堆中的对象。
当一个应用变量出作用域时,它会从堆栈中删除。但引用对象的数据仍然保留在堆中,一直到程序结束 或者 该数据不被任何变量应用时,垃圾收集器会删除它。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
下列各式中,(  )的商最小.A.2.1÷0.14
1兆是多少度电
怎样调出来佳能单反相机拍摄张数?快门使用次
52度、尊王铁盒酒多少钱一盒
怎样才能找到一份合适自己的工作
淡化与去色斑先要了解它是怎么形成的,淡化与
从南昌瑶瑚至安徽九华山走那条高速最近,有多
4x-2x5=14怎么解
每栋楼的铝合金门窗占土建的百分之几
参观纪念馆的作文开头
所有黑洞中有什么生物
住楼房怎么晒被子效果好
骑这个战速电动车上路会不会被警察抓。
本人身高1.567M,17岁。大约能长多高啊?
台湾酵瘦吃了不停拉肚子
推荐资讯
安倍一路小跑见普京 日本怎么看
五四华庭到底是不是79中学区
h丫dro一fo尺ce中文翻译什么意思
上火会不会引起肚子胀气
苹果识别不到usb设备怎么装驱动
芈月传樗里疾为什么不姓赢?为什么帮助嬴荡
12.13对吗
王华同学对体育比赛中的一些现象进行分析,其
我有个朋友在南宁上班 她叫了我好几次让我去
S37瘦身喷雾安全吗?
求歌词:你用一生一世的心,换我一生一世的情
求推荐一些自制陶瓷小礼品。
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?