这几天总有人问堆和栈有什么区别,我当时也不是很清楚,只是知道一些概念而没有深入的去了解。
今天有时间就去看看堆和栈的区别。我总结的或许不太完整或者有错误,希望大家不吝指教!
堆:
Heap 译为"堆"或者是“堆内存”,堆内存的含义可参看堆内存的百度百科。
在这里“堆”是一种特殊的树形数据结构,它满足堆的特性:父节点的值一定大于或等于子节点的值。堆被认为在计算机算法中起到重要作用,并被用于各种编程语言,例如c++、Java等中。堆使用的是二级缓存
栈:
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表。栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。栈是只能在某一端插入和删除的特殊线性表。栈使用的是一级缓存。
堆和栈的主要区别由以下几点:
1、管理方式不同;
2、空间大小不同;
3、分配方式不同;
4、效率不同:
5、生长方向不同;
第一点管理方式的不同:
栈:程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放。
堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。
第二点空间大小的不同:
栈:手动内存空间
堆:自动内存空间
系统不同、程序不同,所分配的堆和栈也不同,可以通过小的测试程序,测试其默认空间大小
第三点分配方式的不同:
堆都是手动分配的。通过malloc并设置大小通过free释放空间。如果没有释放最后程序结束,通过系统回收。
栈是在程序编译时分配的,不可以手工干预。
第四点效率不同:
前面介绍了栈使用的是一级缓存,和cpu中寄存器的速度差不多。堆使用的是二级缓存,相对来说速度就慢一些了。
第五点生长方式的不同:
堆:生长方向是向上的,也就是向着内存高地址方向增长;
栈:它的生长方向是向下生长的,是向着内存低地址方向增长。
我现在总结了这些,若有问题可以讨论修改,
实践是检验真理的唯一标准!!
1603

被折叠的 条评论
为什么被折叠?



