A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 肖彬 中级黑马   /  2013-3-11 17:59  /  2993 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在C#中有没有存在堆(heap)和栈(stack)的概念 假如存在他们的区别又是什么呢

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

4 个回复

正序浏览
C#中必须存在堆与栈
1、堆(heap):
堆是从下往上分配,所以已用的空间在自由空间下面,C#中所有引用类型

的对象分配在托管堆上,托管堆在内存上是连续分配的,并且内存对象的

释放受垃圾收集机制的管理,效率相对于栈来说要低的多。
栈(stack):
栈是自上向下进行填充,即由高内存地址指向低内存地址,并且内存分配

是连续的,C#中所有的值类型和引用类型的引用都分配在栈上,栈根据后

进先出的原则,依次对分配和释放内存对象。
2、当一个类的实例对象创建的时候,这个对象的不同成员按类别被分配到

了不同的内存区域,值类型和引用类型的指针被分配到了栈上,引用类型

的实例对象被分配到了托管堆上,静态成员被分配到了全局数据区。此时

栈上的指针会指向堆上的对象。当对象使用完以后,引用和实际对象的联

系就会断开,从而从而使对象冬眠。因为栈具有自我维护性,它的内存管

理可以通过操作系统来完成,而此时堆上的冬眠对象就需要通过垃圾回收

器(GC)使用一定的算法来进行回收,释放对象所占据的内存。
3、栈上和堆上的成员均进行复制叫深拷贝 只在栈上复制叫浅拷贝
回复 使用道具 举报
有的,值类型(int char  枚举 结构 bool)存储在栈上
引用类型(数组 string 类)在栈上存地址,在堆上存值。
回复 使用道具 举报
那我们在编写C#代码是能不能操作堆呢?
回复 使用道具 举报
1.栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量,值类型参数等都在栈内存中;
2.堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况确定要分配的堆内存的大小。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马