JavaScript 栈内存 & 堆内存

2019-12-30  本文已影响0人  Shaw007
前言:

之前看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

https://hashnode.com/post/does-javascript-use-stack-or-heap-for-memory-allocation-or-both-cj5jl90xl01nh1twuv8ug0bjk

上一篇下一篇

猜你喜欢

热点阅读