堆和栈的区别

这几天总有人问堆和栈有什么区别,我当时也不是很清楚,只是知道一些概念而没有深入的去了解。

今天有时间就去看看堆和栈的区别。我总结的或许不太完整或者有错误,希望大家不吝指教!

堆:

Heap 译为"堆"或者是“堆内存”,堆内存的含义可参看堆内存的百度百科。
在这里“堆”是一种特殊的树形数据结构,它满足堆的特性:父节点的值一定大于或等于子节点的值。堆被认为在计算机算法中起到重要作用,并被用于各种编程语言,例如c++、Java等中。堆使用的是二级缓存

栈:

栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表。栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。栈是只能在某一端插入和删除的特殊线性表。栈使用的是一级缓存。

堆和栈的主要区别由以下几点:

   1、管理方式不同;  

  2、空间大小不同;   

3、分配方式不同;

4、效率不同:

5、生长方向不同;



第一点管理方式的不同:

栈:程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放。

堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。

第二点空间大小的不同:

栈:手动内存空间

堆:自动内存空间

系统不同、程序不同,所分配的堆和栈也不同,可以通过小的测试程序,测试其默认空间大小


第三点分配方式的不同:

堆都是手动分配的。通过malloc并设置大小通过free释放空间。如果没有释放最后程序结束,通过系统回收。

是在程序编译时分配的,不可以手工干预。

第四点效率不同:

前面介绍了栈使用的是一级缓存,和cpu中寄存器的速度差不多。堆使用的是二级缓存,相对来说速度就慢一些了。

第五点生长方式的不同:

生长方向是向上的,也就是向着内存高地址方向增长

它的生长方向是向下生长的,是向着内存地址方向增长。



我现在总结了这些,若有问题可以讨论修改,

实践是检验真理的唯一标准!!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值