前言:
之前看C,C++, JavaScript 都有提及栈内存和堆内存,但对这两者在计算机中具体的实行一直不太清楚,通过搜索参考了techdifferences.com, hashnode上面的一些文章,了解的更深入了一点,在此记录一下。
栈和堆的区别
数据结构中,我们知道栈和堆的区别主要是定义在其上的数据操作方法不同,前者是LIFO, 后者是动态随机分配的,两者都可以用线性或者链式结构实现,但书中常用的是数组。
对比参照 | 栈 | 堆 |
---|---|---|
分配方式 | 内存以LIFO分配 | 内存随机分配 |
是否连续 | 连续 | 非连续 |
分配和回收 | 编译器自动管理 | 需手动管理 |
开销 | 小 | 大 |
大小 | 难以更改 | 容易更改 |
调用 | O(N) | O(1) |
存在问题 | 内存不足 | 内存碎片化 |
局部性 | 优越 | 适中 |
访问 | 速度快 | 速度稍慢 |
通过研读文章了解到栈是由编译器分配的,在内存中小的固定大小的内存空间,是连续的,用于静态内存分配,故有良好的程序局部性,Cache命中率高,效率高,访问速度快;而堆则是由程序员主动申请分配和管理的,用于动态内存分配,其大小可变,不连续分配,存在碎片化的问题,效率较低,访问速度慢得多。常说得堆栈就是栈,
区分栈和堆主要是看速度快慢。
使用场景
通常一个新的线程启动,编译器会创建对应的堆栈环境,用于保存参数和数据,容量比较小,保存常被访问的,此外函数调用是将一系列的堆栈入口地址压入堆栈,然后依据LIFO次序,传给程序计数器,这些地址称之为Stack Frame。在C中,栈常用于低开销的简单数据类型,如整型,浮点型,指针(指针其实就是无符合整型的数,代表内存地址),主要存在的问题是容量小,容易stack overflow。
堆则是位于内存中的一块大区域,用来存储任意的无顺序的数据,所以其访问速度比较慢,但由于有指针指向对应的数据,访问是O(1)级别的,其申请和回收都需要程序员管理,常见的有malloc 申请空闲空间等
参考资料
https://techdifferences.com/difference-between-stack-and-heap.html
网友评论