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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴伟 中级黑马   /  2012-12-17 16:03  /  2000 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

堆和栈的主要区别是什么?麻烦用个例子介绍一下。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

7 个回复

倒序浏览
栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。编译期间就分配好的内存空间.
堆:一般由程序员分配释放,用new等分配内存函数分配得到的就是在堆上。堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 张向阳 于 2012-12-18 01:07 编辑

堆和栈的区别可以用如下的比喻来看出: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就 走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自 由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。  希望这个解释能帮到你!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
值类型中只运用栈,引用类型栈和堆一起运用的

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
对于值类型的变量来说,栈里面直接存放的就是变量的值;而对于引用类型的变量来说,栈里面存放的是地址,真正的值存放在堆里面,而这个栈地址是指向存放在堆里面的那个值的。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
老师说:
以下为比喻
栈:弹夹(后进先出先进后出。。。。。。)
堆:装子弹的盒。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
rla540 中级黑马 2012-12-19 00:29:35
8#
本帖最后由 rla540 于 2012-12-19 00:31 编辑

当调用一个函数时就会在栈中为这个函数开辟空间,用来存放参数,局部变量,函数返回地址等信息,当函数退出时这些空间就会由系统自动收回。栈空间的数据是从高地址向低地址依次存放数据的,所以空间是连续的!不会产生碎片
栈空间一般都是存放体积比较小得数据。当需要一些大数据时,一般都是放在堆空间中的,只需要在栈空间中存放这个堆空间的地址(4字节大小)就可以对堆空间中庞大的数据进行操控了!堆数据的释放C#中是垃圾回收器进行处理得!实现应该是比较复杂的!堆空间数据的生命周期也相对较长一些!搞这么多空间无非是方便数据有效率的调用和能更好地满足不同数据的处理。当然内存中除了这两个区域外还有其它的区域。像方法区,也叫代码区,所有函数实现都在这个区域存储,这里的数据用来控制CPU的执行。还有静态存储区,一般全局变量和静态变量会放在这个区域。各种硬件也会占用一些内存空间。系统也占用了大半空间。所以如果你电脑有4G内存的话,可用得内存空间也就不到4G了

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马