永发信息网

c#堆和栈的区别

答案:2  悬赏:0  手机版
解决时间 2021-03-14 06:22
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运行库保存对的状态信息,在堆中添加新数据时,堆栈中的引用变量也要更新。性能上损失很多!

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

当一个应用变量出作用域时,它会从堆栈中删除。但引用对象的数据仍然保留在堆中,一直到程序结束 或者 该数据不被任何变量应用时,垃圾收集器会删除它。
全部回答
在c#中,同一个string(内容完全一致)的情况下会被自动放到一个字符串池中,也就是说,a和b只是指向同一个string为“string”内容的指针。因此指针创建了2次,但是string的实例只创建了一次。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
圆通快递一直在转运中心,有没有人能帮忙查下
孙家厂地址在哪,我要去那里办事
西宁哪有放高利贷的
兴旺酒店桌椅办公用品家具批发在哪里啊,我有
C++,如何模板函数里面使用 常规参数?
南通好又多超市怎么加盟的,要什么手续,有地
建集装箱别墅怎么审批地皮
海尔冰箱夏季温度定几度最好
在能源保和环压力下,以节能、环保、安全为主
请问去银行贷款一千可以的吗,须要什么低
西子一间B栋在哪里啊,我有事要去这个地方
小米note突然开不了机也关不了机怎么办
南京哪有好点的修索尼相机的地方?
曲径通幽的意思是什么啊?
我想用声音工作,比如读有声小说,有什么渠道吗
推荐资讯
小苗与大树成语
从滕州有到台儿庄的直达汽车吗?
大家知道“超级赛亚人”用日语怎么说吗
奥康俱乐部(北大游泳馆)怎么去啊,有知道地址
378÷4的列竖式计算怎么写你教我
在光影魔术手排版的8张2寸照,6寸4R的证件照
有没有软件可以更改物理键,比如把电源键更改
#中核检修有限公司#您好!本人是焊接专业的非
美天莱便利店我想知道这个在什么地方
永恒的爱英文歌词意思
为啥优宝汇里的产品都只有一个月啊,我想要长
福泓酒水行怎么去啊,有知道地址的么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?