黑马程序员技术交流社区

标题: 堆和栈的一些疑问 [打印本页]

作者: 管章鹏    时间: 2013-4-2 10:19
标题: 堆和栈的一些疑问
在看教程的时候经常听老师们说什么在内存堆上申请了一块内存空间,指向栈之类的问题,
一直不明白什么是堆什么又是栈,
我想问一下大神们什么是堆什么是栈?还有不懂数据结构方法的知识会不会影响学习c#,
正在学习基础,请大神们予以解答,非常感谢!
作者: 张君    时间: 2013-4-2 10:26
内存结构:

栈内存:  局部变量都在栈内存 定义在方法内 方法上 for 循环上的都是局部变量。
数据使用完毕 自动释放。

堆内存:new  出来的实体都在堆内存。实体包括 数组和对象, 堆内存中的实体都有默认初始化值    当 实体在堆内存失去与栈内存联系时 由gc 垃圾 回收机制在堆内存中清除。不定时清除

方法区 本地方法区 寄存器

栈和堆怎么联系?
堆内存中的每一个实体都有一个位置 (地址),将地址赋值给栈内存的变量。换句话说就是 变量引用了实体,也就是所谓的引用数据类型的由来。


运行时 才在堆内存开辟空间
作者: DWC_5101    时间: 2013-4-2 10:47
堆(heap):
堆是从下往上分配,所以已用的空间在自由空间下面,C#中所有引用类型的对象分配在托管堆上,托管堆在内存上是连续分配的,并且内存对象的释放受垃圾收集机制的管理,效率相对于栈来说要低的多。

栈(stack):
栈是自上向下进行填充,即由高内存地址指向低内存地址,并且内存分配是连续的,C#中所有的值类型和引用类型的引用都分配在栈上,栈根据后进先出的原则,依次对分配和释放内存对象。

数据结构和方法的知识,很重要,你可以在学习C#语法和基础时,顺带就学习到一些了。
基础扎实后,再把数据结构的知识强化一下,ok了。
作者: HM邱刚权    时间: 2013-4-2 13:58
栈(stack)是一个内存数组,是一个LIFO(ladt-in first-out 先进后出)的数据结构栈(stack)存储几种类型的方式:
1.某些类型变量的值。
2,程序员当前的执行环境。
3,传递给方法的参数。
数据只能从栈的顶端插入和删除
把数据放入栈顶叫入栈
从栈顶删除叫出栈。
堆:是一块内存区域,在堆里可以分配大块的内存用于存储某类型的数据对象,与栈不同,堆里能够
以任意的顺序存入和移除,虽然程序可以在堆里保存数据,但并不能显式的删除它们,GLR的自动(Garbage Collector,垃圾收集器)
在判断出程序的代码将不会再访问某数据项时,自动清除无主的堆对象,我们因此不在操心这项使用其他编程语言时非常容易出错
的工作了!

作者: 张正强    时间: 2013-4-2 23:36
没有楼上介绍的那么详细,我的观点很简单:
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
栈是编译期间就分配好的内存空间,因此在代码中必须就栈的大小有明确的定义。
作者: 管章鹏    时间: 2013-4-5 18:32
谢谢各位的回答,学到了好多,不过在看面试宝典的时候,看到正好有这么一个题目,说到栈和堆的区别,现在总结一下:

栈是编译期间就分配好的内存空间,因此代码中必须就栈的大小有明确的定义;
局部值类型变量、值类型参数等都在栈内存中。堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况确定要分配的堆内存的大小。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2