博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[c#基础]堆和栈
阅读量:6911 次
发布时间:2019-06-27

本文共 998 字,大约阅读时间需要 3 分钟。

前言

    堆与栈对于理解.NET中的内存管理、垃圾回收、错误和异常、调试与日志有很大的帮助。垃圾回收的机制使程序员从复杂的内存管理中解脱出来,虽然绝大多数的C#程序并不需要程序员手动管理内存,但这并不代表程序员就无需了解分配的对象是如何被回收的,在一些特殊的场合仍需要程序员手动进行内存管理。

堆栈基础

什么是栈(stack)?

  栈是一个内存数组,是一个LIFO(last-in first-out,后进先出)的数据结构。由高内存地址指向低内存地址,并且内存分配是连续的。

  栈存储几种类型的数据:值类型的值,程序当前的执行环境和传递给方法的参数。

  栈的特征:数据只能从栈的顶部插入和删除;把数据放入栈顶称为入栈(push);把数据从栈顶移除称为出栈(pop);

  

  什么是托管堆(heap)?

  堆是一块内存区域,在这里可以分配大块的内存给某类型的数据。与栈不同,堆里的内存可以任意的顺序存入和移除。

  虽然程序可以在堆里保存数据,却不能显示的删除它们。CLR的自动GC(垃圾回收机制)在判断出代码不在访问某数据项时,自动清除无主的堆数据。

  

值类型和引用类型

   数据项的类型定义了存储数据的内存大小、组成该类型的数据成员以及该类型能执行的函数。类型还决定了对象在内存中的存储位置--栈和堆。

   类型分为:值类型和引用类型。两种类型在内存中的存储方式不同。

   如果类型不是其他类型的成员,对于值类型,数据存储在栈中,对于引用类型,实际数据存储在堆中引用存储在栈中。

  

  如果类型是引用类型的成员,如Student类中包含int类型的年龄和string类型的名称。实例化一个学生对象,则这个对象的引用存放在栈中,其真实数据(包含年龄和名称)则被存入堆中。同时名称由于是引用类型,依然被划分为两块内存区域,一块存放引用,一块存放真实数据。

  

  C#中的类型划分如下图:

  

本文来自:

博客地址:
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。
转载:http://www.cnblogs.com/wolf-sun/p/3810689.html
你可能感兴趣的文章
20150625_Andriod_01_ListView1_条目显示
查看>>
jmeter线程组之间传递参数
查看>>
2016 11 24
查看>>
monkey测试===Monkey测试策略(系列二)转
查看>>
安全测试===如何查看浏览器保存的密码
查看>>
java中too many characters in character literal
查看>>
POJ3177 Redundant Paths【双连通分量】
查看>>
bzoj3339 bzoj3585
查看>>
bzoj4080
查看>>
El表达式的用法个人总结
查看>>
object - c 语言基础 进阶笔记 随笔笔记
查看>>
iOS开发之--一些有用的博文和博客
查看>>
jmeter JDBC Request (查询数据库获取数据库数据) 的使用
查看>>
深入理解ajax系列第七篇——传递JSON
查看>>
Vim简明学习
查看>>
poj4012
查看>>
16.文件file
查看>>
第二题,第三题
查看>>
文件属主获取
查看>>
PHP-FPM@year12
查看>>